我有以下c代码:
int foo = 0;
printf("output1: %08x\n", (~0x0) << (~0));
printf("output2: %08x", (~0x0) << (~foo));
打印出来:
output1: ffffffff
output2: 80000000
为什么换算相同的数字会产生不同的结果?
答案 0 :(得分:3)
基本上你的片段是未定义行为的狂欢。
0x0
文字以及int
类型的变量已签名,这意味着它们可以获得负值。 ~0
始终是负值。因此,在这个程序中可能发生任何事情,包括崩溃和燃烧的整个过程。根据经验,从不使用带符号运算符和/或按位运算符。
答案 1 :(得分:2)
有些编译器可能会告诉你原因:
warning: shift count is negative [-Wshift-count-negative]
printf("output1: %08x\n", (~0x0) << (~0));
^ ~~~~
整数是有符号的,补充它们可能会产生负值,而负数的变化是不确定的。
例如,在我的机器上它产生:
output1: e785ba48
output2: 80000000