2012-04-15 19 views
0

私は2つのunsigned integersを掛けたいのですが、私は結果が9989990010あるべきunsigned long long変数符号なしの長い長い算術演算

unsigned long long M; 
unsigned int X; 
unsigned int Y; 

X = 999999; 
Y = 9990; 
M = X * Y; 

Mになりたいが、何らかの理由でそれが1400055418

Iされ続けますこれで一週間悩まされていました。私は泣きたいところに到達したと思います!

+2

9989990010LL%(1 << 32)== 1400055418LL –

答えて

6

XYlong longにキャストする必要があります。

M = (unsigned long long)X * Y; 

結果がより大きなタイプに基づいています。

これ以外の場合、結果はintとなり、オーバーフローします。割り当て時にlong longにキャストされますが、遅すぎる可能性があります:-)

1

少なくとも1つをunsigned long longにキャストしてください。もう一方は自動的にキャスト(プロモート)されます。ここでの問題は次のとおりです。intの値に切り捨てられた結果、または切り捨てられていない結果、long longの値を切り捨てた結果を表示するかどうかをコンパイラはどのように知っていますか?

3

XとYの両方がintであるため、式X * Yの型はintです。乗算が既に行われた後、数値はlong longに変換されます。 XとYをlong longにすると、期待通りの結果が得られます。