我想在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。此外,鉴于a
和b
都具有相同的 unsigned 类型,即使算术结果超过其类型的范围,它们的总和也得到很好的定义。此外,当溢出时,总和的(c(结果将小于 a
和 b
,否则,我们可以使用以下事实:c关系操作评估为0或1以表达携带位为
carry = (a + b) < a;
不需要任何标头,也不取决于特定的上限,甚至取决于具有相同类型的a
和b
。只要两者都具有未签名类型,它就正确地报告了总和是否溢出其类型的更宽或unsigned int
(以较宽为准(,这与他们的总和设置为携带位相同。作为奖励,它是根据总和本身表示的,我认为这清楚地表明了正在测试的内容。
随身携带只能是0
或1
。 1
如果有包装,则否则0
。如果a + b > ULONG_LONG_MAX
为真,则可以进行包装效果。请注意,这是用数学术语而不是C而言,就好像a + b
实际上溢出了一样,这将行不通。相反,您想将其重新排列为a > ULONG_LONG_MAX - b
。因此,随身携带的价值将是:
carry = a > ULONG_LONG_MAX - b ? 1 : 0;
或任何优先样式等效。
- 不要忘记包括
limits.h
。