gpt4 book ai didi

c - Bitshift 在不应该的时候导致溢出

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:43:19 27 4
gpt4 key购买 nike

当我对最大正 2 的补码进行位移时,不应该将它位移 31 位来生成有效的 0,因为它以 0111 1111 等开头。

我试过减少类次,但我假设这只是计算机读取不正确。

int main(void) 
{
int x = 0x7FFFFFFF;
int nx = ~x;
int ob = nx >> 31;
int ans = ob & nx;

printf("%d",ans);
}

我期望 ob 为 0,但结果是二进制补码的最小值。我正在使用它来创建一个 bang 而没有实际使用 !。

最佳答案

如果您要移动最大正二进制补码,它最终为零。

但是你没有改变那个数字:

int x = 0x7FFFFFFF;
int nx = ~x; // 0x80000000 (assuming 32-bit int).

您正在对最大(量级) 数进行位移。

并且,根据标准文档 C11 6.5.7 位移运算符/5(我强调):

The result of E1 >> E2 is E1 right-shifted E2 bit positions. If E1 has an unsigned type or if E1 has a signed type and a nonnegative value, the value of the result is the integral part of the quotient of E1 / 2^E2 . If E1 has a signed type and a negative value, the resulting value is implementation-defined.

您的实现似乎保留了符号位,这就是您最终得到非零负值的原因。


顺便说一句,如果你想要一个 ! 运算符,你可以使用:

output = (input == 0);

请参阅上述标准,6.5.3.3 一元算术运算符/5(同样是我强调的),其中明确指出了等价性:

The result of the logical negation operator ! is 0 if the value of its operand compares unequal to 0, 1 if the value of its operand compares equal to 0. The result has type int. The expression !E is equivalent to (0==E).

关于c - Bitshift 在不应该的时候导致溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57881433/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com