C 按位左移位运算符分布在加法上

C 按位左移位运算符分布在加法上,c,bit-shift,C,Bit Shift,这里有一个关于逻辑右移运算符的线程,但我没有找到任何关于逻辑左移运算符的线程。我的问题是,对于任何字号w的固定字号语言,一个整数常量0好吧,对于大于或等于0的c值,您的定义应该是正确的 反例: (x+y)Leftshift正好乘以2的幂。所以,(x+y) 是真的吗(对于c>=w给定0,移位的结果是未定义的。如果x,y或x+y是有符号整数,则移位的结果也是未定义的,相应的移位会导致溢出。这个答案不令人满意。请详细说明导致反例的x和y的具体值。I忘了提到c是非负的。我在我的问题中添加了这个约束。你的

这里有一个关于逻辑右移运算符的线程,但我没有找到任何关于逻辑左移运算符的线程。我的问题是,对于任何字号
w
的固定字号语言,一个整数常量
0好吧,对于大于或等于0的c值,您的定义应该是正确的

反例:


(x+y)Leftshift正好乘以2的幂。所以,
(x+y)

是真的吗(对于
c>=w
给定
0,移位的结果是未定义的。如果
x
y
x+y
是有符号整数,则移位的结果也是未定义的,相应的移位会导致溢出。这个答案不令人满意。请详细说明导致反例的x和y的具体值。I忘了提到c是非负的。我在我的问题中添加了这个约束。你的问题现在应该得到回答:)哦!谢谢!我希望有人能在这个问题上给出一个严格的证明。如果你移动的值超过了它的长度,它将始终是0;)是的,但大多数机器都实现两个补码整数算法,我假设是两个补码整数算法。此外,我假设任何空间不足的1都会被直接删除,我认为这是很直观的。@Sanfer你错过了一个大问题。因为C规范说它是未定义的行为,所以C编译器,即使在2的补码机器上,也会利用UB来优化代码。因此,在C语言中,您无法计算
int
-溢出将以任何规定的方式起作用,如“耗尽空间的1将被简单地丢弃”这不是优化的C编译器在2015年的工作方式。@Sanfer建议仔细阅读该标准,仅当右操作数为负或大于或等于左操作数的宽度时,该标准才是未定义/未绑定的。这里,左操作数的宽度为
w
。我假设
0我明白了,谢谢你的解释。虽然我的问题比其他任何问题都抽象,但我很好奇。C在算术方面必须遵循什么?考虑到算术是计算的一个基本部分,而溢出在像C这样的固定字数语言中是不可避免的,它必须被定义为某种东西,但是什么呢?