我试图将0xFFFFFFFF
的值位移 32 位,它正确地来到如果我写
x = x << 32;
但是它保持0xFFFFFFFF
当我写:
x = x << y
当y = 32
我真的完全不明白这一点。
不过,我需要能够使用变量,用于移动32 - n
编辑
如果<< 32
是未定义的,那么我真的无法感知创建用 1 填充 n - 上位的函数的方法
按变量或更大的位长度移动是未定义的行为。从 C99 标准草案部分6.5.7
按位移位运算符:
[...]如果右操作数的值为负数或大于或等于提升的左操作数的宽度,则行为未定义。
正如帕斯卡所说,你需要做一个特例或使用更广泛的类型。
gcc
在某些情况下可以为此生成警告,请实时查看:
警告:左移计数>= 类型宽度 [默认启用]
变量移动其包含的位数或更多位数是未定义的行为。假设x
是 32 位,则没有"正确"的结果。
我使用的编译器标识了此编程错误:
x.c:3:3: error: left shift count >= width of type [-Werror]
如果y
属于 int
类型(因为文字32
也是 int
类型),并且程序定义了行为,则行为没有区别。
如果x
是32
位宽的类型,则程序将调用未定义的行为,因此一切都可能发生。
您可能希望执行以下操作:
unsigned int x;
unsigned long bx = ((unsigned long)x)&0xFFFFFFFFUL;
int n = 0; // put whatever you have
int y = 32-n;
bx = bx << y;
x = bx&0xFFFFFFFFUL;