c++ - 尽管使用了 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;
}
解决方案
数字10
和100
是整数文字,A
,B
和是 类型。这意味着表达式将使用该类型,并且由于结果不适合该类型,因此行为未定义:C
D
int
(percent*(A*B*C*D))/100
int
当有符号整数算术运算溢出(结果不适合结果类型)时,行为是未定义的——这种运算的可能表现包括:
- 它根据表示的规则(通常是 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';
}
推荐阅读
- excel - 为什么使用变量的计算与使用单元格引用的计算给出不同的结果?
- javascript - 会话变量第一次加载页面时没有“更新” - XMLHttpRequest,PHP
- mongodb - 在 MongoDB 副本集中读取自己的写入。随意的一致性不起作用?
- sql - Oracle Apex:编译错误成功
- mediawiki - Mediawiki 在内部搜索中排除/隐藏页面
- google-cloud-storage - GCS - 将数据迁移到存档桶的成本
- laravel - Laradock - 从网址中删除端口不起作用
- sql - PostgreSQL 返回 JSON 数组
- powershell - 使用 powershell 将文件批量转换为 webp
- linux - 解决 ld 的“无效字符串偏移”错误的典型方法是什么?