使用pow()
库中的<cmath>
,我得到一些数字的负数。
2601*((int)pow(10.0,3*2)) = -1693967296
为什么会这样?是因为int
只有-32767到32767之间的范围?或者是因为演员?
答案 0 :(得分:5)
当您溢出有符号整数类型时,程序的行为未定义。
userDetailsFactory
不返回负数。该特定重载将返回pow(10.0, 3 * 2)
。您将其转换为int然后将其乘以常量。这太大了,不适合double
。您是否在平台上查看了int
(或同等的INT_MAX
)?
答案 1 :(得分:2)
这不是pow()
,但是你先发了答案。
10到6的功率是一百万,而一百万次是2,601是
2,601,000,000
对于平台上的有符号整数,范围可能是
–2,147,483,648 to 2,147,483,647
所以你看,你已经超出了那个范围。实际的溢出差异可能看起来不一致,但这是因为两个补码形式。
答案 2 :(得分:2)
这是因为整数溢出。
2601*1000000 > INT_MAX.
因此溢出。
答案 3 :(得分:0)
是的,这是因为 int 数据类型。 int 范围从-2,147,483,648到2,147,483,647,因为 sizeof(int) 是4个字节。
要解决此问题,您可以使用 unsigned int 或 long int
答案 4 :(得分:0)
您的平台似乎有一个32位的int。这支持范围-2147483648到2147483647
pow()在双精度浮点数中返回一个正数。这个位工作正常。
你的演员将其转换为int,再次没问题。
出现问题的地方是乘法。乘法溢出,有符号溢出是未定义的行为。
在你的情况下,你似乎已经完成了二次补充,但是你应该意识到这种行为并不是很好的,特别是对于现代优化编译器。