最關鍵的是,該產品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? –