我想乘兩個unsigned integers
,但我想要的結果是在一個unsigned long long
可變無符號長長的算術
unsigned long long M;
unsigned int X;
unsigned int Y;
X = 999999;
Y = 9990;
M = X * Y;
M
應該9989990010
但由於某些原因一直充滿1400055418
我我已經爲此困擾了一個星期了,我想我已經達到了我想哭的地步!
我想乘兩個unsigned integers
,但我想要的結果是在一個unsigned long long
可變無符號長長的算術
unsigned long long M;
unsigned int X;
unsigned int Y;
X = 999999;
Y = 9990;
M = X * Y;
M
應該9989990010
但由於某些原因一直充滿1400055418
我我已經爲此困擾了一個星期了,我想我已經達到了我想哭的地步!
您需要將X
和Y
轉換爲long long
。
M = (unsigned long long)X * Y;
足夠投其中之一結果將基於較大的類型。
否則結果將是int
,因此溢出。它將被分配到long long
,但這將太晚:-)
將其中至少一個投射到unsigned long long
。另一個會自動投射(提升)。這裏的問題是:編譯器如何知道是否需要將值爲int
的值或截斷值的值的截斷結果?
X和Y都只是整數,所以表達式X * Y的類型是一個整型。在乘法完成後,該數字被轉換爲很長的時間。讓X和Y長期持久,你會得到預期的結果。
9989990010LL%(1 << 32)== 1400055418LL – 2012-04-15 09:39:21