首页 > 解决方案 > 尽管使用了 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;
}

标签: c++variablestypesinteger-overflow

解决方案


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

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

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

看起来这发生在给定的程序中,导致一个负数。可以将涉及的变量之一转换为 along long int并依赖整数转换和表达式的特定运算符优先级来避免溢出,但最好完全避免这种情况并声明/定义中使用的变量/值表达式为long long int's。使用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';
}

推荐阅读