得到 unsigned long long 加法进位
get unsigned long long addition carry
我想在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;
}
进位只能是0
或1
。 1
如果有 wrapping-around,否则 0
。
wrapping-around 是在 a + b > ULONG_LONG_MAX
为 true 的情况下发生的。注意,这是数学上的说法,不是C语言上的说法,好像a + b
其实是溢出了,那这不行。相反,您想将其重新排列为 a > ULONG_LONG_MAX - b
。所以进位的值将是:
carry = a > ULONG_LONG_MAX - b ? 1 : 0;
或任何首选的等效样式。
- 不要忘记包括
limits.h
。
作为@EugeneSh。观察到,进位要么是 0,要么是 1。此外,鉴于 a
和 b
都具有相同的 unsigned 类型,即使算术结果超出了它们类型的范围。此外,当发生溢出时,总和的 (C) 结果将小于 a
和 b
,否则会更大,因此我们可以利用 C 关系运算的计算结果为 0 或 1 的事实将进位表示为
carry = (a + b) < a;
这不需要任何 headers,也不依赖于特定的上限,甚至不依赖于具有相同类型的 a
和 b
。只要两者都有无符号类型,它就会正确报告总和是否溢出了它们类型中较宽的类型或 unsigned int
(以较宽者为准),这与它们的总和设置进位位相同。作为奖励,它以总和本身表示,我认为这清楚地表明了正在测试的内容。
我想在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;
}
进位只能是0
或1
。 1
如果有 wrapping-around,否则 0
。
wrapping-around 是在 a + b > ULONG_LONG_MAX
为 true 的情况下发生的。注意,这是数学上的说法,不是C语言上的说法,好像a + b
其实是溢出了,那这不行。相反,您想将其重新排列为 a > ULONG_LONG_MAX - b
。所以进位的值将是:
carry = a > ULONG_LONG_MAX - b ? 1 : 0;
或任何首选的等效样式。
- 不要忘记包括
limits.h
。
作为@EugeneSh。观察到,进位要么是 0,要么是 1。此外,鉴于 a
和 b
都具有相同的 unsigned 类型,即使算术结果超出了它们类型的范围。此外,当发生溢出时,总和的 (C) 结果将小于 a
和 b
,否则会更大,因此我们可以利用 C 关系运算的计算结果为 0 或 1 的事实将进位表示为
carry = (a + b) < a;
这不需要任何 headers,也不依赖于特定的上限,甚至不依赖于具有相同类型的 a
和 b
。只要两者都有无符号类型,它就会正确报告总和是否溢出了它们类型中较宽的类型或 unsigned int
(以较宽者为准),这与它们的总和设置进位位相同。作为奖励,它以总和本身表示,我认为这清楚地表明了正在测试的内容。