c - 直接将左移运算的结果赋值给一个变量和C中的左移赋值运算有什么区别?

标签 c bit-shift relational-operators

在下面的表达式中,左移运算的结果被赋值给变量i

int i;
i = 7 << 32;
printf("i = %d\n",i);

在下面的表达式中,进行了左移赋值操作。

int x = 7;
x <<= 32;
printf("x = %d\n",x);

以上两个表达式给出了不同的结果。但是下面两个表达式就不一样了。他们都给出了相同的结果。那么上述表达式返回不同值的原因可能是什么?

int a;
a = 1 + 1;
printf("a = %d\n",a);

int b = 1;
b += 1;
printf("b = %d\n",b);

最佳答案

C 标准说:

The result is undefined if the right operand is negative, or greater than or equal to the number of bits in the left expression’s type.

所以,这是未定义的行为,因为int 通常是32 位的大小,这意味着只有0 通过 31 个步骤是明确定义的

关于c - 直接将左移运算的结果赋值给一个变量和C中的左移赋值运算有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44255195/

相关文章:

c - 制作命名管道并使用轮询

c - PCAP 以太类型返回

c++ - 左移 << 如何在不同的函数中给出不同的结果?

typescript - 在 TypeScript 中的小于或大于比较中允许可以为 null 的操作数

c:这条线是做什么的?

c - Arduino digitalRead() 总是返回低电平

c - C 中的 do while 语句

arrays - 在 Verilog 中移动 2D 数组

c - 如何在 RNG 中多次将函数的输出传递给自身?

c - '<' 在 if 语句中不起作用