最关键的是,该产品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);
}
通过使用'unsigned long long'?您除以最大无符号值,因此在'unsigned int'范围内的所有结果(除了一个)都将为'0'。 –
如果计算是使用任意大小的中间体执行的,则无法单独使用操作顺序来获得相同的结果。可能有一些技巧可以针对输入值(最简单:c = 7;'),但除此之外,最好的做法是明确提升到更广泛的类型,比如'uintmax_t'。 –
我不明白你为什么期望答案是7.完全精确的答案将有五个低位全零,并且高于所有一个的32位。你如何得到7? –