我想获得在c中添加两个无符号64位整数的进位位。
如果需要,我可以使用x86-64 asm。
代码:

#include <stdio.h>

typedef unsigned long long llu;

int main(void){
  llu a = -1, b = -1;
  int carry = /*carry of a+b*/;
  llu res = a+b;
  printf("a+b = %llu (because addition overflowed), carry bit = %d\n", res, carry);
  return 0;
}

最佳答案

作为@EugeneSh。观察到,进位为0或1。此外,由于ab都具有相同的无符号类型,即使算术结果超出其类型范围,它们的总和也可以很好地定义。此外,总和的(C)结果在发生溢出时将小于ab,否则更大,因此我们可以使用C关系运算的值等于0或1来将进位表示为的事实

carry = (a + b) < a;

这不需要任何 header ,也不依赖于特定的上限,甚至不依赖于具有相同类型的ab。只要两者都具有无符号类型,它就会正确报告总和是否溢出其类型中的较宽类型或unsigned int(以较宽者为准),这与它们的总和设置进位位相同。作为奖励,它是用总和本身来表示的,我认为可以清楚地说明正在测试的内容。

关于c - 长期未加签名,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56027411/

10-09 08:43