C++ 除法返回相反的(负)结果
每当我尝试除以两个整数时,当整数大于C++ 除法返回相反的(负)结果,c++,c++11,division,C++,C++11,Division,每当我尝试除以两个整数时,当整数大于21474836时,我会得到一些奇怪的结果-我认为这是一些数据类型限制的情况,但是integer显然要大得多:2147483647 正如我所说,只有当两个整数大于21474836时才会发生这种情况 工作(因为整数低于21474836): 不工作: (211474836 * 100) / 211474836 // returns 0, should 100 (31474830 * 100) / 31474837 // returns -99, should 99
21474836
时,我会得到一些奇怪的结果-我认为这是一些数据类型限制的情况,但是int
eger显然要大得多:2147483647
正如我所说,只有当两个整数大于21474836时才会发生这种情况
工作(因为整数低于21474836
):
不工作:
(211474836 * 100) / 211474836 // returns 0, should 100
(31474830 * 100) / 31474837 // returns -99, should 99~
(40000000 * 100) / 41474837 // returns -7, should 96~
在此处观看现场演示:
问题是什么?当您将这些值乘以100时,结果溢出并设置最高位,将值带入负区域。不要忘记
211474836*100
大于INT\u MAX
,因此您越过了整数的边界。将这些值解释为int64,您应该会得到正确的结果。您已经混淆了,2147483647是有符号长字符的上限。整数的上限为65535-有关详细信息,请参阅
将值更改为无符号长字符将为您提供解决问题所需的范围(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;
}
#包括
使用名称空间std;
int main()
{
在我看来,这似乎是一个家庭作业问题……我想知道你们认为乘法有什么作用……试着用100ULL
替换100
。试着先除法,然后乘法,然后它将在整数范围内,如(40000000*100)
将超出范围。谢谢……我实在太累了,没有注意到这一点。我非常欣赏这个详细的答案:-)考虑一下,如果您想允许有符号/负值(在示例中不需要计算),您可以使用L
(长)更改UL
(无符号长)!
#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;
}