【发布时间】:2017-10-18 18:31:15
【问题描述】:
在我的程序中,我必须对无符号整数进行算术运算。
- 变量 a 的范围是 0 到 4294967295。
- 变量 b 的范围是 0 到 32。
当我通过取 a 和 b 的最大值来检查边界条件时,我得到 0 作为答案,因为当我尝试将 a 和 MAX_NS 相乘时发生溢出>。理想情况下,我应该得到 7 作为答案。我如何编写程序以处理溢出问题,我得到 7 作为答案,希望它适用于 a 和 b 的其他有效值范围。谢谢。
#include "stdio.h"
#define MAX_NS 1000000000
int main()
{
unsigned int a = 4294967295;
unsigned int b = 32 ;
unsigned int c = ((b * MAX_NS)/a);
printf("%d",c);
}
**编辑:**请注意,我不能使用 unsigned long long。我只能对变量使用 unsigned int。
【问题讨论】:
-
使用
unsigned long long?您正在除以最大无符号值,因此在unsigned int范围内的所有结果(除了一个)将是0。 -
没有办法单独使用操作顺序来获得与使用任意大小的中间体执行计算时相同的结果。您可能可以使用特定于输入值的技巧(最简单的:
c = 7;),但除此之外,您能做的最好的事情就是显式提升为更广泛的类型,例如uintmax_t。 -
我不明白你为什么期望答案是 7。完全精确的答案将有五个低位全为零,而高于该位的 32 位全为 1。你如何从中得到 7 个?
-
"...对无符号整数执行算术运算。...
a的范围为 0 到 4294967295"。嗯,除法当然是“`1 to 4294967295”。 -
#define MAX_NS 1000000000-->#define MAX_NS 1000000000ull
标签: c time overflow unsigned multiplication