尽管使用long long int,但由于溢出而导致的负结果



尽管使用了long long int数据类型,为什么这个程序的结果是负的?请帮帮我。我的代码如下:

#include <iostream>
#define percent 10
int main() {
int A=200,B=400,C=150,D=210;
long long int non_Zero_value_number;
non_Zero_value_number=(percent*(A*B*C*D))/100;
std::cout<< "Number of  value 10% = " << non_Zero_value_number << std::endl;
}

数字10100为整数字面值,ABCDint类型。这意味着表达式(percent*(A*B*C*D))/100将使用int类型,由于结果不适合该类型,因此行为是未定义的:

当有符号整数算术操作溢出时(结果不适合结果类型),行为是未定义的,-这种操作的可能表现形式包括:

  • 它根据表示规则(通常是2的补码)环绕,
  • […]

似乎在给定的程序中发生了这种情况,结果是一个负数。可以将其中一个涉及的变量强制转换为long long int,并依靠整数转换和表达式的特定操作符优先级来避免溢出,但最好完全避免这种情况,并将表达式中使用的变量/值声明/定义为long long int。使用LL后缀来定义long long int整数字面值(c++ 11)。

代码示例(应用了一些重构):
#include <iostream>
#define PERCENT 10LL
int main()
{
long long int A=200,B=400,C=150,D=210;
long long int non_zero_value_number=(PERCENT*(A*B*C*D))/100LL;
std::cout << "Number of  value 10% = " << non_zero_value_number << 'n';
}

如果您确定变量总是取正整数,那么您可以使用unsigned long long int,如下面的程序所示。当您将变量命名为non_Zero_value_number时,这是有意义的。

#include<iostream>
#include<vector>
#include <stdio.h>
#include <cstdlib>
#include <ctime>
#include <fstream>
#include <sstream>
#define percent 10
using namespace std;
int main () {

srand((unsigned) time(0));
unsigned long long int A=200,B=400,C=150,D=210,E=50,F=30;
unsigned long long int non_Zero_value_number;
non_Zero_value_number=(percent*(A*B*C*D))/100;
cout<< "Number of  value 10% = " << non_Zero_value_number<<endl;
return 0;
}

您应该将其他int型也声明为long long int型

计算(A * B * C * D)返回一个负数,因为它们都是正则整数,结果溢出int。这应该可以修复:

long long int A=200,B=400,C=150,D=210,E=50,F=30;
此外,虽然不是技术上不正确,但通常#define变量都是大写的,所以很清楚它们来自哪里。乍一看,我心想:"他们在哪里声明百分比?"
#define PERCENT 10

当然你也需要修改:

non_Zero_value_number=(PERCENT *(A*B*C*D))/100;

您要么需要将其中一个要乘法的变量声明为long类型,要么需要在乘法期间将其强制转换为long类型。

声明一个变量为长变量:长A = 200;int B = 400, C=150, D=210,…

声明所有变量为long:A = 200, B = 400, C=150, D=210,…

在乘法运算中将变量A转换为long:non_Zero_value_number =(% *((长)BC * D))/100,

问题在于c++在将最终结果转换为long类型之前先在int类型中进行所有的计算。这意味着一旦int值超过2147483647,您仍然需要处理int溢出(参见https://learn.microsoft.com/en-us/cpp/c-language/cpp-integer-limits)

因为10 × 200 × 400 × 150 × 210 = 25200000000,你超出了int的限制几个数量级

注意:这个问题与链接中的问题非常相似(尽管是针对c++而不是c#):int与long result的乘积c#

最新更新