我的原始代码采用x并将其转换为最大的负数int
*x = 1 <<31 | ~ 1<<31;
哪个有效,但当我尝试使用
时*x = 1 <<31;
它返回了相同的答案,有人可以解释为什么会这样吗?
答案 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;
相同的最终值