微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C中的按位加法溢出检查

如何解决C中的按位加法溢出检查

我正在尝试编写一个函数,如果发生溢出,该函数返回0,否则返回1。我仅限于按位函数,没有强制转换,并且int始终为32位。

我似乎遇到了addOK(0x80000000,0x80000001)返回1而不是0的问题,并且我认为这是因为notsum =!(x + y)不等于0。我不确定如何解决这个。有什么想法吗?

/* 
 * addOK - Determine if can compute x+y without overflow
 *   Example: addOK(0x80000000,0x80000000) = 0,*            addOK(0x80000000,0x70000000) = 1,0x80000001) = 0,*   Legal ops: ! ~ & ^ | + << >>
 *   Max ops: 20
 *   rating: 3
 */
int addOK(int x,int y) {
  int notsum = !(x + y); // 0 if true,1 if false 
  int mask = notsum + ~0; // ~0 is all 1s! overflow to 0s if notx is false
  return (1 & mask) | (0 & ~mask); // mask is 1s if x is true
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。