<c++基础(5)>整数溢出

整数溢出

在工程中遇到问题,两个int类型加减结果赋值给double类型时提示溢出风险:

//sum和sumb都是int类型,
double a =double(sum - sumB);

这里发生了整数溢出,整数溢出是指当计算结果超出了整数类型所能表示的范围时发生的情况。在计算sum - sumB时,如果sumsumB的值很大,而且它们的差值超出了int类型的表示范围,就会发生溢出。然后,将溢出的结果转换成double类型可能会导致精度损失或不可预料的行为。

假设int类型的范围是[-2147483648, 2147483647],即约为[-2^31, 2^31 - 1]。现在定义两个整数 sumsumB,它们的值分别为 2147483647-2147483648,即分别为2^31 - 1-2^31。在这种情况下,计算 sum - sumB 结果为 2147483647 - (-2147483648),即 2147483647 + 2147483648。这个结果是 4294967295,它超出了int类型的范围。如果直接将这个结果转换为double类型,即 double(sum - sumB),则可能导致溢出或精度损失。因为double类型的精度是有限的,无法准确表示所有的整数值,特别是超出其表示范围的值。

以下是在C++中模拟这种情况的示例代码:

#include <iostream>int main() {int sum = 2147483647;int sumB = -2147483648;double result = double(sum - sumB);std::cout << "Result: " << result << std::endl;return 0;
}

在这个例子中,result 的值可能不是预期的 4294967295,而是一个近似值或者超出了 double 类型的表示范围,这取决于系统和编译器的实现。因此,这种情况下确实存在将 double(sum - sumB) 转换为 double 类型时可能发生的溢出或精度损失问题。为了避免这种溢出风险,可以先将sumsumB转换成double类型,然后再进行减法操作,这样就能避免整数溢出的问题,例如:

double result = static_cast<double>(sum) - static_cast<double>(sumB);

这样做可以确保在大整数相减时不会发生溢出,并且得到的结果会以double类型进行存储,保持精度和范围。

int转double

int类型转换为double类型并不会导致溢出风险,因为double类型可以容纳比int类型更大范围的值,并且具有更高的精度。int类型通常是32位,而double类型通常是64位,因此double类型可以表示比int类型更大的整数值和小数值。在C++中,如果你将一个int类型的变量或常量转换为double类型,不会导致溢出。例如:

int a = 1000000;
double b = static_cast<double>(a); // 转换为double类型,不会溢出

在这个例子中,即使a的值很大,转换为double类型也不会导致溢出。但是需要注意的是,如果将一个非常大的int值转换为double类型,并进行一系列复杂的数学运算,可能会导致精度损失或舍入误差,但并不是溢出的问题。

int乘法(另外一个例子)

在将两个int类型的变量相乘后,将结果赋给一个double类型的变量c时,是存在溢出风险的。这种情况可能导致结果超出了int类型能够表示的范围,从而发生溢出。

具体来说,如果两个int变量ab的乘积超出了int类型的范围,那么在将结果赋给double类型的变量c时,可能会出现溢出或截断问题。这是因为double类型的范围通常比int类型大,但并不是无限的,也有其表示范围的极限。

以下是一个可能导致溢出的示例:

#include <iostream>int main() {int a = 1000000;int b = 1000000;double c = a * b;std::cout << "Result: " << c << std::endl;return 0;
}

在这个示例中,ab 的乘积为 1000000 * 1000000 = 1000000000000,即 10^12。这个结果超出了int类型的范围,因为int类型的最大值通常是 2147483647,即 2^31 - 1。因此,在将这个结果赋给double类型的变量c时,可能会导致溢出或截断,从而得到错误的结果。

为了避免这种溢出风险,可以在进行乘法操作之前,先确保检查乘积是否会超出int类型的范围,或者直接将ab转换为double类型再进行乘法操作,例如:

double c = static_cast<double>(a) * static_cast<double>(b);

存储器角度

当执行 int 类型的乘法并将结果赋值给 double 类型变量时,从存储器的角度来看,涉及到以下几个步骤:

  1. 存储 int 类型变量的过程

    首先,int 类型的变量会被存储在计算机的内存中。通常情况下,编译器会将 int 类型的变量分配给寄存器或者栈内存。在 x86 架构下,32 位的 int 变量可以被存储在 32 位的寄存器(如 eax)中或者栈内存中。

  2. 乘法运算的过程

    当执行 int 类型的乘法运算时,比如 int result = a * b;,乘法运算的结果会暂时保存在一个寄存器中(如 edx:eax 寄存器对组用于存储 64 位的结果),或者在栈内存中的某个位置。

  3. 将结果赋给 double 类型变量的过程

    当将 int 类型的乘法结果赋值给 double 类型的变量时,编译器会执行类型转换。这个过程可能包括以下几个步骤:

    • 将乘法运算的结果(32 位或 64 位)读取出来。
    • 将结果转换为 double 类型的浮点数。这个过程可能会引起精度损失或截断,这是由于计算结果超出int类型表示范围引起的。
    • 将浮点数存储在 double 类型的变量所对应的内存空间中。

总体来说,从存储器的角度来看,int 类型的乘法结果会暂时存储在寄存器或者栈内存中,然后经过类型转换后存储到 double 类型的变量中。在这个过程中可能发生精度损失或者数值截断,在处理大数值的乘法运算时,需要注意可能引起的精度问题。

总结

通常情况下,int类型的计算结果不会超出int的表示范围,此时不会引起数据溢出。但是不能排除这种极端情况,因此最好的预防措施是提前转换为double

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/796939.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

南京观海微电子---Vitis HLS设计流程(实例演示)——Vitis HLS教程

1. 前言 课时2我们介绍了Vitis HLS的设计流程&#xff0c;如下图所示&#xff1a; 算法或软件的设计和仿真都基于C/C&#xff0c;通过HLS平台导出打包好的IP RTL代码&#xff0c;最后将该打包的IP加入到主工程使用。 本课时&#xff0c;我们通过一个具体的实例&#xff0c;演示…

Dapr(三) Dapr核心组件的使用一

结合前两期 Dapr(一) 基于云原生了解Dapr(Dapr(一) 基于云原生了解Dapr-CSDN博客) Dapr(二) 分布式应用运行时搭建及服务调用(Dapr(二) 分布式应用运行时搭建及服务调用-CSDN博客) 下篇推出dapr服务注册与发现&#xff0c;dapr组件绑定&#xff0c;dapr Actor功能。 目录 1.…

中颖51芯片学习2. IO端口操作

一、SH79F9476 I/O端口介绍 1. 特性 SH79F9476提供了30/26位可编程双向 I/O 端口&#xff1b;端口数据在寄存器Px中&#xff1b;端口控制寄存器PxCRy是控制端口作为输入还是输出&#xff1b;端口作为输入时&#xff0c;每个I/O端口均带有PxPCRy控制的内部上拉电阻。有些I/O引…

超详细!211页网络协议与管理,看完终于明白了(建议收藏)

与其说计算机改变了世界&#xff0c;不如说是计算机网络改变了世界。作为计算机网络通信实体之间的语言&#xff0c;网络通信协议对计算机正常通信起着极大的作用。 那么到底什么是网络协议与管理呢&#xff1f;今天给大家分享一份211页网络协议与管理文档&#xff0c;包含概念…

碧桂园服务净利降两成,关联交易收入仅占2.9%,发力增值服务充电桩日进超10万

自2018年分拆上市以来&#xff0c;碧桂园服务经历过非常高速的发展&#xff0c;曾是物管市场的“并购王”&#xff0c;但从2023年开始&#xff0c;希望从外延式的增长向内生式增长转型&#xff0c;将往期的经验与教训&#xff0c;通过投后管理沉淀下来&#xff0c;向高质量发展…

nginx多https证书配置精简

其实有很多方式&#xff0c;网上看到一个这个方法&#xff0c;给大家介绍一下。 首先&#xff0c;开启支持-TLS SNI support Nginx开启单IP多SSL证书支持-TLS SNI support Nginx支持单IP多域名SSL证书需要OpenSSL支持&#xff0c;首先需要编译安装一个高版本的openssl。 检查…

04 Python进阶:MySQL-PyMySQL

什么是 PyMySQL&#xff1f; PyMySQL 是一个用于 Python 的纯 Python MySQL 客户端库&#xff0c;提供了与 MySQL 数据库进行交互的功能。PyMySQL 允许 Python 开发人员连接到 MySQL 数据库服务器&#xff0c;并执行诸如查询、插入、更新和删除等数据库操作。 以下是 PyMySQL …

自动驾驶领域中的感知,决策,控制

目录 一、自动驾驶领域感知决策控制概论 二、自动驾驶感知 三、自动驾驶决策 四、自动驾驶控制 一、自动驾驶领域感知决策控制概论 1.感知&#xff08;Perception&#xff09;&#xff1a;感知是指系统通过各种传感器来感知周围环境的能力&#xff0c;包括识别和理解道路、…

第29篇:秒表计时器

Q&#xff1a;本期我们采用计数器来实现秒表计时器&#xff0c;循环进行0~9计时。 A&#xff1a;在数码管HEX0上循环从0到9计数&#xff0c;间隔时间为1s&#xff0c;使用计数器实现1s时间间隔。 DE2-115开发板提供了50MHz时钟&#xff0c;触发器直接以50MHz信号作为同步时钟…

过亿级别的用户数据如何检查用户名是否存在?

目录 引言用户名存在性检查的挑战用户规模庞大带来的性能挑战数据一致性与并发性问题防止恶意行为的挑战 常见的解决方案基于数据库的方案基于缓存的方案基于分布式系统的方案基于搜索引擎的方案 案例分析与实践经验分享社交媒体平台的用户名检查方案 引言 随着互联网的普及和数…

redis的Bitmaps详细介绍

Redis的 Bitmaps&#xff08;位图&#xff09;并不是一种特殊的数据类型&#xff0c;而是字符串的二进制操作。虽然在 Redis 内部&#xff0c;BitMaps 是以字符串数据类型来存储的&#xff0c;但是它们却可以使用一些特殊的命令进行操作。如下是关于Redis Bitmaps的详细介绍&am…

PS从入门到精通视频各类教程整理全集,包含素材、作业等(9)复发

PS从入门到精通视频各类教程整理全集&#xff0c;包含素材、作业等 最新PS以及插件合集&#xff0c;可在我以往文章中找到 由于阿里云盘有分享次受限制和文件大小限制&#xff0c;今天先分享到这里&#xff0c;后续持续更新 第一课 ——第三课素材文件 https://www.alipan.c…

怎么在UE过场动画中加入振动效果

我们已经学会了怎么在游戏中加入振动效果&#xff0c;比较典型的交互场景如&#xff1a;在开枪时让手柄同步振动&#xff0c;实现起来真的很简单&#xff0c;就是定义场景和事件&#xff0c;然后在游戏事件发生时播放特定的振动资源文件&#xff0c;跟播放音效是极其相似的&…

探索Linux的挂载操作

在Linux这个强大的操作系统中&#xff0c;挂载操作是一个基本而重要的概念。它涉及到文件系统、设备和数据访问&#xff0c;对于理解Linux的工作方式至关重要。那么&#xff0c;挂载操作究竟是什么&#xff0c;为什么我们需要它&#xff0c;如果没有它&#xff0c;我们将面临什…

2024年华为OD机试真题-找数字-Java-OD统一考试(C卷)

题目描述: 小扇和小船今天又玩起来了数字游戏,小船给小扇一个正整数n (1<=n<=1e9),小扇需要找到一个比n大的数字m,使得m和n对应的二进制中1的个数要相同(如4对应二进制100,8对应二进制1000,1的个数都为1),现在求m的最小值。 输入描述: 输入:第一行输入一个正整数…

【实时监控主机与某个IP的网络连接情况】

Python脚本 写个脚本监控主机与某几个IP的连接情况&#xff0c;发现存在这种连接的&#xff0c;记录连接起始时间、源IP源、端口、目的IP、目的端口等信息 import os import time import subprocess from typing import List# 目标IP列表 TARGET_IPS ["192.168.1.1&quo…

基因组de novo组装

分以下几个部分&#xff1a; CLR组装 HIFI组装 ONT组装 二、三代数据矫正 组装结果评估 一、CLR组装 下机数据&#xff1a; 主要用那个bam文件 软件&#xff1a;wtdbg2 第一步&#xff1a;bam转fasta文件 参考&#xff1a;https://www.jianshu.com/p/03c7eb11102d # 进行基…

基于单片机放大电路程控放大特性参数设计

**单片机设计介绍&#xff0c;基于单片机放大电路程控放大特性参数设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机放大电路程控放大特性参数设计是一个结合了单片机编程和放大电路技术的综合性项目。以下是对该设计项目的概…

第⑪讲:Ceph集群OSD扩容方案及实现横向和纵向扩容

文章目录 1.Ceph集群OSD扩容方案2.实现OSD的横向扩容4.实现OSD的纵向扩容 1.Ceph集群OSD扩容方案 Ceph集群OSD的扩容支持两种方式&#xff1a; 横向扩容 通过增加OSD节点来达到扩容的目的。使用横向扩容要完成以下几个步骤&#xff1a; 在新的机器中进行初始化操作、配置Yum源…

AJAX —— 学习(三)(完结)

目录 一、jQuery 中的 AJAX &#xff08;一&#xff09;get 方法 1.语法介绍 2.结果实现 &#xff08;二&#xff09;post 方法 1.语法介绍 2.结果实现 &#xff08;三&#xff09;通用型的 AJAX 方法 1.语法介绍 2.结果实现 二、AJAX 工具库 axios &#xff08…