C-获得未签名的长期添加



我想在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 = %dn", res, carry);
  return 0;
}

as @eugenesh。此外,携带是0或1。此外,鉴于ab都具有相同的 unsigned 类型,即使算术结果超过其类型的范围,它们的总和也得到很好的定义。此外,当溢出时,总和的(c(结果将小于 ab,否则,我们可以使用以下事实:c关系操作评估为0或1以表达携带位为

carry = (a + b) < a;

不需要任何标头,也不取决于特定的上限,甚至取决于具有相同类型的ab。只要两者都具有未签名类型,它就正确地报告了总和是否溢出其类型的更宽或unsigned int(以较宽为准(,这与他们的总和设置为携带位相同。作为奖励,它是根据总和本身表示的,我认为这清楚地表明了正在测试的内容。

随身携带只能是011如果有包装,则否则0。如果a + b > ULONG_LONG_MAX为真,则可以进行包装效果。请注意,这是用数学术语而不是C而言,就好像a + b实际上溢出了一样,这将行不通。相反,您想将其重新排列为a > ULONG_LONG_MAX - b。因此,随身携带的价值将是:

carry = a > ULONG_LONG_MAX - b ? 1 : 0;

或任何优先样式等效。

  • 不要忘记包括limits.h

相关内容

  • 没有找到相关文章

最新更新