Wil*_*inG 4 c gcc bit-manipulation bit-shift
我得到了一些令我困惑的C代码:
int a = 1;
int b = 32;
printf("%d\n %d\n", a<<b, 1<<32);
Run Code Online (Sandbox Code Playgroud)
输出是
1
0
Run Code Online (Sandbox Code Playgroud)
代码在Ubuntu 16.04(Xenial Xerus)上运行,我使用gcc -m32 a.cGCC版本5.4.0 编译它.
我已经阅读了一些帖子,解释了为什么a<<b输出1,但我不明白为什么1<<32结果为0.我的意思是,a<<b和之间有什么区别1<<32?
将32位向int左移32是未定义的行为,因此可以生成任何值作为结果.您的C编译器应该在1<<32表达式时警告您.
您看到的两个输出不同的原因是它们由不同的代码路径生成:
a << b 使用变量,因此它在运行时由编译的代码计算1<<32 是一个常量表达式,因此它在编译时由编译器本身计算看起来编译的代码按模32执行移位,因此移位32与移位零相同.然而,编译器本身移位32,将一位丢弃.编译器可以自由地执行此操作,因为此行为未定义.因此,该标准不要求任何特定行为,甚至不要求同一程序的各部分之间的一致行为.
| 归档时间: |
|
| 查看次数: |
847 次 |
| 最近记录: |