在 C 中,常数的位移与具有相同值的变量的位移之间是否有区别

  • 本文关键字:变量 有区别 是否 之间 常数 c bit-shift
  • 更新时间 :
  • 英文 :


我试图将0xFFFFFFFF的值位移 32 位,它正确地来到如果我写

0
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 类型),并且程序定义了行为,则行为没有区别。

如果x32位宽的类型,则程序将调用未定义的行为,因此一切都可能发生。

您可能希望执行以下操作:

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;

最新更新