[英]Bit Shifting: Shift Count >= Width Of Type
下面的代码在编译时抛出由第 9 行引起的警告:
警告:移位计数 >= [-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;
行形成对比unsigned m = x << 32;
它总是以无效的数量移动。
我认为为什么第 8 行没有发出警告是因为左移无符号 int32 >= 32 位不是未定义的行为。
C 标准(N2716,6.5.7 按位移位运算符)说:
E1 << E2 的结果是 E1 左移 E2 位位置; 空出的位用零填充。 如果 E1 具有无符号类型,则结果的值为 E1 × 2^E2,比结果类型中可表示的最大值减少模 1。 如果 E1 有符号类型和非负值,并且 E1 × 2^E2 在结果类型中是可表示的,那么这就是结果值; 否则,行为未定义
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.