在C中,具有相同值的变量的位移与常量的位移是否存在差异?

krb*_*686 2 c bit-shift

我试图将值移位0xFFFFFFFF32位,如果我写的话它正确地变为0

x = x << 32;
Run Code Online (Sandbox Code Playgroud)

但它保持不变 0xFFFFFFFF

我写的时候:

x = x << y
Run Code Online (Sandbox Code Playgroud)

什么时候 y = 32

我根本不明白这一点.

我需要能够使用一个变量,对于一个转换的函数 32 - n

编辑

如果<< 32是未定义的,那么我真的无法想出一种方法来创建一个用1来填充n - 高位的函数

Sha*_*our 5

通过变量或更大的位长移位是未定义的行为.从草案C99标准部分6.5.7 按位移位运算符:

[...]如果右操作数的值为负或大于或等于提升的左操作数的宽度,则行为未定义.

正如Pascal所说,你需要制作一个特殊情况或使用更广泛的类型.

gcc在某些情况下,可以生成一个警告这个现场看看吧:

警告:左移计数> =类型的宽度[默认启用]