2011-10-14 51 views
19

我查了文档long = int64已经距离大于900,000,000,000,000为什么这会导致很长的整数溢出

这里是我的代码:

int r = 99; 
long test1 = r*r*r*r*r; 

在运行时,它给了我919965907而不是正确的9509900499。

另一个测试

long test2 = 99*99*99*99*99; 

它拒绝编译,称整数溢出。

但如果我这样做

long test3 = 10100200300; 

这工作得很好。

回答

48

的问题是,文字“99”被视为一个int。如果您添加“L”,它会将其视为长时间。为了解决您的编译问题:

long test2 = 99L * 99L * 99L * 99L * 99L; 

并修复“不正确的结果”所造成整数溢出:

long r = 99; 
long test1 = r * r * r * r * r; 

关键的一点是,体现出了“=”进行评估的权之前完成long r的分配。

还有其他文字后缀你可能感兴趣的:

Type Suffix Example 
uint U or u 100U 
long L or l 100L 
ulong UL or ul 100UL 
float F or f 123.45F 
decimal M or m 123.45M 

@ m.edmonson,关于你的,为什么它出来到919965907.这是怎么回事的问题,是该值是“包装”周围int.MaxValue。你可以用一个小测试程序看到:

int i = 99; // 99 
i *= 99; // 9801 
i *= 99; // 970299 
i *= 99; // 96059601 
i *= 99; // 919965907  should be 9509900499 but comes out to 919965907 
      //      which is (9509900499 % int.MaxValue) 

long k = 9509900499 % int.MaxValue; 

什么意思是“环绕”?当您以1超过int.MaxValue时,值“返回”到int.MinValue

int j = int.MaxValue; 
j++; 

bool isNowMinValue = (j == int.MinValue); // true, the value has "wrapped around" 

这有点简单化;如果你搜索“整数溢出”,你会得到一个更好的解释。这是值得理解如何整数(和其他数字类型)与32个比特表示:

http://en.wikipedia.org/wiki/Signed_number_representations

+0

优秀的答案 - 你能解释一下为什么他在长整数乘法之间得到不同的结果? –

+0

你能澄清你的意思吗?那么这与模数%有关? –

+0

我相信你只需要一个'99L',剩下的就会变成upcast。 –

5

它使用整数乘法:

long r = 99; 
long test1 = r*r*r*r*r; 
3

你的第二测试失败,因为每99是整数;用下面的代替它并编译。

long test2 = 99L * 99L * 99L * 99L * 99L; 

查看MSDN Long Documentation了解详情。

1

编译器将99看作整数,即使最终结果很长。

这将工作。

long test2 = 99L*99L*99L*99L*99L; 
4

正如其他人所说,但:

long test2 = 99L * 99 * 99 * 99 * 99; 

这会给你用更少的L各地:-)

这是因为第一99L是long正确的结果,因此,所有的乘法在long“场”和做乘法之前所有其它整数upcasted到long(明确乘法始终是2号之间,并将其从左至右,所以它就像(((99L * 99)* 99)* 99)* 99和每一个“局部”的结果是一个漫长而导致下一个操作数转换为长)

相关问题