【发布时间】:2020-02-23 00:03:07
【问题描述】:
在做数学运算时,如何得到溢出的部分?
例如,假设 32 位整数:
unsigned int a = 0Xffffffff;
unsigned int b = 0xffffffff;
unsigned int c = a + b;
在这种情况下,c 是 0xfffffffe,但答案应该是 0x1fffffffe。我如何得到溢出的 1?
我怎样才能对乘法做同样的事情?我可以将两个大数相乘,只得到溢出的部分吗?
bigint 库如何管理这个?
【问题讨论】:
-
可能是relevant
-
用 64 位整数移位怎么样?
-
由于两个数之和大于存储量,所以无处存放数,这就是溢出的原因。如果您可以在某处检查溢出,则根本不需要溢出。但是,您可以检测到溢出并执行其他操作,
if(UINT_MAX - a < b) then handle_it() -
unsigned long long int是标准 C 类型,必须至少有 64 位,因此,对于您的 32 位示例,乘积可以计算为(unsigned long long int) a * b,之后低和高 32位可以通过移位和掩码提取。 -
@Dr.-Ing.GerhardStein 问题会以 unsigned long long 出现。那是什么类型的呢?
标签: c math integer-overflow