通过数字移位与通过变量移位不同

时间:2018-02-08 07:28:02

标签: c byte-shifting

我有以下c代码:

int foo = 0;
printf("output1: %08x\n", (~0x0) << (~0));
printf("output2: %08x", (~0x0) << (~foo));

打印出来:

output1: ffffffff
output2: 80000000

为什么换算相同的数字会产生不同的结果?

2 个答案:

答案 0 :(得分:3)

基本上你的片段是未定义行为的狂欢。

  • 0x0文字以及int类型的变量已签名,这意味着它们可以获得负值。 ~0始终是负值。
  • 使用负值左移一个带符号的int会调用未定义的行为。 (6.5.7 / 4)
  • 尝试移动比左操作数中的空间更多的位置会调用未定义的行为。 (6.5.7 / 3)
  • 尝试移位负数位会调用未定义的行为。 (6.5.7 / 3)

因此,在这个程序中可能发生任何事情,包括崩溃和燃烧的整个过程。根据经验,从不使用带符号运算符和/或按位运算符。

答案 1 :(得分:2)

有些编译器可能会告诉你原因:

warning: shift count is negative [-Wshift-count-negative]
printf("output1: %08x\n", (~0x0) << (~0));
                                 ^  ~~~~

整数是有符号的,补充它们可能会产生负值,而负数的变化是不确定的。

例如,在我的机器上它产生:

output1: e785ba48
output2: 80000000