当移位计数> =类型的宽度时的不同情况

时间:2016-01-31 04:32:34

标签: c

班次计数<类型的宽度,它按预期工作:

int a = 1 << (8 * sizeof(int) - 1);
printf("%x\n", a); // 80000000

移位数&gt; =类型宽度时,结果每次都不同,似乎没有法则:

int b = 1 << 8 * sizeof(int); // int b = 1 << (8 * sizeof(int) + 1);
printf("%x\n", b); // such as 59fa2ba8, 5b0f6ba8, 52f46ba8 etc

嗯,有一个警告说 警告:班次计数&gt; =类型[-Wshift-count-overflow]的宽度 。如果这可以解释随机结果,那么让我把班次计数变成一个变量:

int k = 8 * sizeof(int);
int c = 1 << k;
int d = 1 << (k + 1);
printf("%x\n", c); // 1
printf("%x\n", d); // 2

结果与以前完全不同,这是循环移位!怎么解释这个?

1 个答案:

答案 0 :(得分:3)

int b = 1 << 8 * sizeof(int);

受到未定义的行为。

来自C99标准:

  

6.5.7按位移位运算符

     

3对每个操作数执行整数提升。结果的类型是提升的左操作数的类型。如果右操作数的值为负或大于或等于提升的左操作数的宽度,则行为未定义。

尝试理解这种操作的结果是毫无意义的。