gpt4 book ai didi

C 在减法期间检查溢出

转载 作者:太空宇宙 更新时间:2023-11-04 03:15:02 27 4
gpt4 key购买 nike

我一直在尝试判断两个32位的数相减是否溢出。我得到的规则是:

Can only use: ! ~ & ^ | + << >>
* Max uses: 20
Example: subCheck(0x80000000,0x80000000) = 1,
* subCheck(0x80000000,0x70000000) = 0
No conditionals, loops, additional functions, or casting

目前为止

int dif = x - y; // dif is x - y
int sX = x >> 31; // get the sign of x
int sY = y >> 31; // get the sign of y
int sDif = dif >> 31; // get the sign of the difference
return (((!!sX) & (!!sY)) | (!sY)); // if the sign of x and the sign of y
// are the same, no overflow. If y is
// 0, no overflow.

我现在意识到我不能在实际函数中使用减法 (-),所以我的整个函数无论如何都是无用的。如何使用不同于减法的方法并仅使用位运算来判断是否存在溢出?

最佳答案

谢谢大家的帮助!这是我想出的办法来解决我的问题:

int ny = 1 + ~y; // -y
int dif = x + ny; // dif is x - y
int sX = x >> 31; // get the sign of x
int sY = y >> 31; // get the sign of -y
int sDif = dif >> 31; // get the sign of the difference
return (!(sX ^ sY) | !(sDif ^ sX));

我尝试过的每一个案例都奏效了。我通过获取 y 而不是 ny 的符号来改变@HackerBoss 的建议,然后在 return 语句中反转两个检查。这样,如果符号相同,或者结果的符号与 x 的符号相同,则返回 true。

关于C 在减法期间检查溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52862239/

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