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;
}