在C中使用逻辑OR进行逐位移位

时间:2017-01-29 20:31:08

标签: c

我的原始代码采用x并将其转换为最大的负数int

*x = 1 <<31 | ~ 1<<31;

哪个有效,但当我尝试使用

*x = 1 <<31;

它返回了相同的答案,有人可以解释为什么会这样吗?

2 个答案:

答案 0 :(得分:1)

如果您的int在您的架构上为32位,则最大的负int值显然是0x80000000。 让我们看看你的代码并添加括号来显示运算符的优先级(这是关键):

*x = 1 <<31 | ~ 1<<31 = (1 << 31) | ((~1) << 31)

表达式((~1) << 31)的计算结果为0x00000000 所以最终的结果是1 << 31 = 0x80000000

答案 1 :(得分:0)

如果您知道两个补码,那么您知道对于32位整数,0x80000000必须是最大的负值,因为如果您翻转这些位并从0x80000000添加一个,则得到0x7fffffff。添加一个,你得到0x80000000,32位可能的最大负数。这在MSB中有1,并且没有办法比这更大,因为初始数字需要为符号保存一点。您的原始代码只用1填充int,然后移过31,得到与* x = 1&lt;&lt; 31;

相同的最终值