位移位:移位计数 >= 类型宽度
Bit Shifting: Shift Count >= Width Of Type
下面的代码在编译时会抛出由第 9 行引起的警告:
warning: shift count >= width of type [-Wshift-count-overflow]
然而,第 8 行并没有抛出类似的警告,尽管 k == 32
(我相信)。我很好奇为什么会发生这种行为?我正在使用 gcc
编译器系统。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int bit_shift(unsigned x, int i){
int k = i * 8;
unsigned n = x << k; /* line 8 */
unsigned m = x << 32; /* line 9 */
return 0;
}
int main(){
bit_shift(0x12345678, 4);
return 0;
}
bit_shift
中 k
的值取决于参数 i
。并且因为 bit_shift
没有声明 static
它可能会被其他翻译单元调用(阅读:其他源文件)。
所以它不能在编译时确定这个移位将永远是一个问题。这与总是移动无效量的行 unsigned m = x << 32;
形成对比。
我认为为什么第 8 行没有发出警告是因为左移一个 unsigned int32 >= 32 位 不是未定义的行为。
C 标准(N2716,6.5.7 移位运算符)说:
The result of E1 << E2 is E1 left-shifted E2 bit positions; vacated bits are filled with zeros. If E1 has an unsigned type, the value of the result is E1 × 2^E2, reduced modulo one more than the maximum value representable in the result type. If E1 has a signed type and nonnegative value, and E1 × 2^E2 is representable in the result type, then that is the resulting value; otherwise, the behavior is undefined
下面的代码在编译时会抛出由第 9 行引起的警告:
warning: shift count >= width of type [-Wshift-count-overflow]
然而,第 8 行并没有抛出类似的警告,尽管 k == 32
(我相信)。我很好奇为什么会发生这种行为?我正在使用 gcc
编译器系统。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int bit_shift(unsigned x, int i){
int k = i * 8;
unsigned n = x << k; /* line 8 */
unsigned m = x << 32; /* line 9 */
return 0;
}
int main(){
bit_shift(0x12345678, 4);
return 0;
}
bit_shift
中 k
的值取决于参数 i
。并且因为 bit_shift
没有声明 static
它可能会被其他翻译单元调用(阅读:其他源文件)。
所以它不能在编译时确定这个移位将永远是一个问题。这与总是移动无效量的行 unsigned m = x << 32;
形成对比。
我认为为什么第 8 行没有发出警告是因为左移一个 unsigned int32 >= 32 位 不是未定义的行为。
C 标准(N2716,6.5.7 移位运算符)说:
The result of E1 << E2 is E1 left-shifted E2 bit positions; vacated bits are filled with zeros. If E1 has an unsigned type, the value of the result is E1 × 2^E2, reduced modulo one more than the maximum value representable in the result type. If E1 has a signed type and nonnegative value, and E1 × 2^E2 is representable in the result type, then that is the resulting value; otherwise, the behavior is undefined