我想乘两个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