在我的程序中,我必须对无符号整数执行算术运算。
当我通过取a和b的最大值检查边界条件时,我得到0作为答案,因为当我尝试乘以 a 和 MAX_NS 。理想情况下,我应该得到7作为答案。如何编写程序以便溢出得到处理,我得到7作为答案,并希望它适用于a和b.Thanks的其他有效值范围。
#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);
}
**编辑:**请注意我不能使用无符号long long。我只能使用unsigned int作为变量。
答案 0 :(得分:2)
这是天气风向标建议的解决方案
#include "stdio.h"
#define MAX_NS 1000000000
int main()
{
unsigned long long a = 4294967295;
unsigned long long b = 32;
unsigned long long c = ((b * MAX_NS) / a);
printf("%llu", c);
}
答案 1 :(得分:0)
关键是必须使用足够宽的数学计算产品b * MAX_NS
。
确保*
个操作数中至少有一个为unsigned long long
。
如果b
足够大且a
足够小,则商需要更宽的类型以避免溢出;
#include "stdio.h"
// #define MAX_NS 1000000000
#define MAX_NS 1000000000LLU
int main(void) {
unsigned int a = 4294967295; // type may remain unsigned
unsigned int b = 32 ; // type may remain unsigned
unsigned long long c = ((b * MAX_NS)/a);
printf("%llu",c);
}
或者,乘以1ull
轻轻地乘以乘法。通常避免像(unsigned long long) b * MAX_NS
中那样进行投射。令人惊讶的匆匆做法有时缩小数学,这可能会在以后uintmax_t b
发生。
#define MAX_NS 1000000000
int main(void) {
unsigned int a = 4294967295; // type may remain unsigned
unsigned int b = 32 ; // type may remain unsigned
unsigned long long c = ((1ull * b * MAX_NS)/a);
printf("%llu",c);
}