每当我试图划分两个整数时,当整数大于21474836
时,我得到一些奇怪的结果 - 我认为这是某些数据类型限制的情况,但是{{1}埃格尔显然要大得多:int
。
正如我所说,只有当两个整数大于2147483647
时才会发生这种情况。
工作(因为整数低于21474836
):
21474836
不工作:
(11474836 * 100) / 11474836 // returns 100
查看此处的实时演示:http://ideone.com/lAeneM
有什么问题?
答案 0 :(得分:2)
当你将这些值乘以100时,结果会溢出并设置最高位,使值变为负值。
答案 1 :(得分:2)
不要忘记211474836 * 100
大于INT_MAX
,所以你越过整数的边界。将值解释为int64,您应该得到正确的结果。
答案 2 :(得分:1)
你已经混淆了,2147483647是签名长的上限。整数上限为65535 - 有关详细信息,请参阅this post。
将值更改为无符号长整数可为您提供解决问题所需的范围(0到4294967295):
#include <iostream>
using namespace std;
int main()
{
cout << "Ret1: " << (21474837UL * 100UL) / 21474837UL << endl; // should result 100
cout << "Ret2: " << (31474830UL * 100UL) / 31474837UL << endl; // should result 99~
cout << "Ret3: " << (40000000UL * 100UL) / 41474837UL << endl; // should result 96~
return 0;
}