繁体   English   中英

C中逻辑或的按位移位

[英]bitwise shift with logical OR in C

我原来的代码将x转换为最大的负整数是

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

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

*x = 1 <<31;

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

如果int在体系结构的32位上,则最大的负int值显然是0x80000000。
让我们看一下代码并添加括号以显示运算符的优先级(这是此处的关键):

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

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

好吧,如果您知道二进制补码,那么您知道对于32位整数,0x80000000必须是最大的负值,因为如果翻转这些位并从0x80000000加一个,则得到0x7fffffff。 加一,您将得到0x80000000,这是32位可能的最大负数。 它的最高有效位(MSB)为1,鉴于初始数字需要为符号节省一点,因此没有办法使该数值更大。 您的原始代码只是将int填充为1,然后移至31,最终结果与* x = 1 << 31;相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM