面试问题

Gir*_*tal 39 c c++

我在昨天的采访中被问到以下代码的输出

#include <stdio.h>
int main(void){
       printf ("%x" ,-1<<4); 
}
Run Code Online (Sandbox Code Playgroud)

我有2分钟时间告诉答案.我回答fffffff0.采访结果尚未宣布.我想知道我的答案是否正确?

Pra*_*rav 58

从技术上讲,左移一个负整数会调用Undefined Behavior.这意味着-1<<4是UB.我不知道为什么他们问你这个问题.可能他们想测试您对C和C++标准的深度了解.

C99 [ 6.5.7/4]说

E1 << E2的结果是E1左移E2位位置; 腾出的位用零填充.如果E1具有无符号类型,则结果的值为E1×2 E2,比结果类型中可表示的最大值减少一个模数.如果E1具有带符号类型和非负值,并且E1×2 E2可在结果类型中表示,那么这就是结果值; 否则,行为未定.

C++ 03通过省略相关文本使其成为未定义的行为.

  • 要么他们想测试知识的深度,要么他们只是简单地不知道.我去过几次采访,他们实际上并不知道技术问题的正确答案.通常情况下,尤其是早期阶段,面试官是人力资源或管理层.据我所知,有些困难的方法,对技术方面非常熟练,对于成为管理层根本没有帮助......甚至可能会伤害你的机会.而人力资源......根本不是他们的领域.根据我的经验,这样的诡计经常被知识渊博的人问到. (24认同)
  • @ Jean-Marc:Prasoons的回答直接来自C99标准.左移负值是未定义的行为.但是,如果*right*移动负值,则结果是实现定义的. (5认同)
  • @Noah:是的 - 我记得被告知当我在回答被问及`unsigned char`和普通`char`之间的区别时,有一个像`signed char`这样的东西是错的. .但那是技术主管,而不是人力资源或管理层. (3认同)

Edw*_*nge 11

不,你不对.这是坏消息.好消息是,面试官可能不知道这一点,假设你是因为它的结果,他们得到当他们编译并运行它.

真正的答案是它是实现定义的.我不相信100%的说,这是不确定的,因为超载的行为,但我认为这可能是.至少虽然结果取决于负数如何表示等等......你声称这两种语言都没有定义输出的内容.

  • ......我说我以为是的. (5认同)
  • 它的UB在C和C++中`:)` (4认同)

cdh*_*wie 9

在我的机器上:

chris@zack:~$ cat > test.c
#include <stdio.h>
int main(void){
       printf ("%x" ,-1<<4);
}

chris@zack:~$ gcc -o test test.c && ./test
fffffff0
Run Code Online (Sandbox Code Playgroud)

但是,结果将取决于您的体系结构和编译器.所以正确的答案是"它可以输出任何东西."

  • "这个答案没用." - 不管怎么说都在哭. (3认同)
  • 没有抱怨积分(无论如何我都受到限制,我可能不在乎)但是当有人投票时,我通常希望他们留下反馈意见,以便我有机会改善我的答案. (3认同)
  • @PigBen编译器输出是无关紧要的,因为它是未定义的行为,并且结果可能会在下一个版本的"<您最喜欢的编译器的插入名称>"中发生变化 (2认同)

mr_*_*air 8

Binary of 1  : 0000 0000 0000 0000 0000 0000 0000 00001
Run Code Online (Sandbox Code Playgroud)

将1的出现替换为1,因为您要计算负数的二进制数

如何计算负数的二进制数

Binary of -1 : 1111 1111 1111 1111 1111 1111 1111 11111

Left shift 4 : 1111 1111 1111 1111 1111 1111 1111 0000
Run Code Online (Sandbox Code Playgroud)

结果左移4的十六进制表示将是

1111 : F 

0000 : 0
Run Code Online (Sandbox Code Playgroud)

所以计算的输出将是:

FFFFFFF0
Run Code Online (Sandbox Code Playgroud)

你的答案是正确的.

  • 谁说机器必须使用二进制补码? (7认同)