我在昨天的采访中被问到以下代码的输出
#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通过省略相关文本使其成为未定义的行为.
Edw*_*nge 11
不,你不对.这是坏消息.好消息是,面试官可能不知道这一点,假设你是因为它的结果,他们得到当他们编译并运行它.
真正的答案是它是实现定义的.我不相信100%的说,这是不确定的,因为超载的行为,但我认为这可能是.至少虽然结果取决于负数如何表示等等......你声称这两种语言都没有定义输出的内容.
在我的机器上:
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)
但是,结果将取决于您的体系结构和编译器.所以正确的答案是"它可以输出任何东西."
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)
你的答案是正确的.
归档时间: |
|
查看次数: |
7808 次 |
最近记录: |