Undefined Behavior
今天 强迫症 朱小瘦同学提到一个非常有意思的问题,一个32bit的无符号整数算术右移32个bit应该得多少?
我们知道算术右移一个bit相当于除2,所以一个32bit无符号整数除以 232,理论上,应该得0。
然而事实不是这样。测试显示在 x86 系统上,一个32bit无符号整数算术右移32个bit之后得到的是原数。例如下面这个测试程序:
1
2
3
4
5
6
7
8
9
10
11
12
13
| #include <stdio.h>
int
main(void /* int argc, char **argv */)
{
unsigned int a = 0x5a5a5a5a;
a >>= 32;
printf("%x\n", a);
return 0;
}
|
不启用任何优化的话,编译出来的程序得到的结果是:
更进一步,我们将上面的测试改写为:
1
2
3
4
5
6
7
8
9
10
11
12
13
| #include <stdio.h>
int
main(void /* int argc, char **argv */)
{
unsigned int a = 0x5a5a5a5a;
int i;
for (i=0; i<33; i++)
printf("%x\n", a >> i);
return 0;
}
|
阅读全文…(
本文约 881 字,阅读大致需要 2 分钟
)