【计组笔记-5】详细测试c++中类型转换的溢出截断处理

2023-11-14


  1. 测试环境是vs2019。
  2. 会尽量把能想到的情况都测试&分析一下,有想不到的还望批评指正。

1. 将小数赋值给float

明天写(记得解释精度丢失)


先跳过吧时间太赶了…我先写点别的,其他几篇笔记已经把原理讲完了,这篇只是测试,过几天再写()。

2. 将整数赋值给float

3. 将整数赋值给int

3.1 算术溢出

如果通过算数运算给变量赋的值大于数据类型能容纳的最大值,则会警告算术溢出,但不会报错,如下所示:

int i = 0x7fffffff+1;

在这里插入图片描述
来分析一下,已知有符号int为32位,其中1位是符号位,31位是数值位,因此,理论上int可储存的最大值为231-1,用16进制表示为0x7fffffff,而理论上最小的溢出值为0x7fffffff+1,也就是i。

溢出之后,i储存了什么内容呢?打印出来看一下:
在这里插入图片描述
翻译成储存的二进制位是1000 0000 0000 0000 0000 0000 0000 0000(理论上是-0,由于不需要存-0,因此这个状态被拿来存-231了,笔记-3中有写),可以发现,如果将其视为无符号数,则刚好是0x7fffffff+1的值。

可见,在这个赋值过程中,编译器是截断32位赋值给左侧int型变量的,并不会因为int有一位是符号位就只截断31还给补足符号位再顺便转换成补码, 而如果只赋值0x7fffffff呢:

int i1 = 0x7fffffff;
int i2 = -0x7fffffff;

在这里插入图片描述
可见,只要右侧的数值只需要低于32位的内容来储存,最高位就可以正确的储存符号位,且储存的也是正确的补码(补码后面的笔记再写,这里不多赘述)。

3.2 非算术溢出(等于32位)

上一小节分析了算术溢出,那么如果是非算术溢出,即直接赋一个超过最大值的数呢?如下所示:

int i1 = 0xffffffff;
int i2 = 0x80000000;

在这里插入图片描述
注意,由于右侧的值并未超过32位,因此这时候是不会报任何错或警告的!此外,打印出来的i1和i2,分别翻译成储存的二进制内容,如下所示:

  1. i1:1111 1111 1111 1111 1111 1111 1111 1111
  2. i2:1000 0000 0000 0000 0000 0000 0000 0000

可见,如果右侧赋值的数大于int能储存的最大值,则这个储存过程是截断32位直接存给int变量指示的那块内存,而并没有添加符号位,再修改为补码这个过程。然而,这个问题是不会报错的,连警告也无!所以还是要自己注意下别超了。

3.3 非算术溢出(大于32位)

上一小节分析了赋的值用32位装得下的问题,那么,如果大于32位,赋值给int会如何截断呢?如下所示:

int i1 = 0x100000000;
int i2 = 0x100000001;
int i3 = 0x180000003;

在这里插入图片描述
根据打印的值,i1,i2,i3实际储存的二进制位如下:

  1. i1:0000 0000 0000 0000 0000 0000 0000 0000(0x00000000)
  2. i2:0000 0000 0000 0000 0000 0000 0000 0001(0x00000001)
  3. i3:1000 0000 0000 0000 0000 0000 0000 0011(0x80000003)

如果观察一下,就可以发现,它们刚好就是从低位开始截取了所赋值的32位,除此之外并没有其他改变。

此外,跟上一小节不同的是,在赋的值需要大于32位来储存时,会报以下警告:
在这里插入图片描述
可见确实是截断操作,此外还可以获得一个信息,这里右侧的数字是用64位int来存的(不知是否与操作系统是64位有关),在小数里也有这个现象(在小数的小节里分析)。

4. 将小数赋值给int

测试如下赋值方式:

int i1 = 0.9;
int i2 = 0x80000000 + 0.9;
int i3 = 0x100000000 + 0.9;
int i4 = 0x180000003 + 0.9 * 2;
int i5 = 0x180000003 + 0.9 + 1;
int i6 = -0x7fffffff + 0.9;
int i7 = -0x7fffffff - 0.9;

在这里插入图片描述
它们报的警告也都是一样的,如下:
在这里插入图片描述
可见,虽然i2,i3,i4与i5的赋值过程中出现了第3部分中分析过的问题,如算术溢出,但如果涉及到了类型转换,则只会提示类型转换的警告

根据打印的值,i1,i2,i3实际储存的二进制位如下:

  1. i1:0000 0000 0000 0000 0000 0000 0000 0000(0x00000000)
  2. i2:1000 0000 0000 0000 0000 0000 0000 0000(0x80000000)
  3. i3:0000 0000 0000 0000 0000 0000 0000 0000(0x00000000)
  4. i4:1000 0000 0000 0000 0000 0000 0000 0100(0x80000004)
  5. i5:1000 0000 0000 0000 0000 0000 0000 0100(0x80000004)
  6. i6:1000 0000 0000 0000 0000 0000 0000 0010(0x80000002)
  7. i7:1000 0000 0000 0000 0000 0000 0000 0001(0x80000001)

分析打印结果可知,将小数赋值给整数,计算后的小数点部分会被抛弃,并且,这个抛弃是发生在全部计算完之后的,可以理解为右侧的表达式计算得出了类型为double的结果,然后再将这个double类型的数赋值给int。

此外,在抛弃掉小数点后的内容之后,剩余整数部分的处理与上一节是一样的,大于等于32位则直接截断(如i2,i3,i4,i5),小于32位就按照正常流程转为补码储存(i6,i7)。(然而,这里并不会提示进行了截断)

5. int和short互相转换

6. double和float互相转换

7. 总结

  1. 敲代码的时候要更加注意溢出这个问题,有时溢出了连警告都没有。
  2. c++好歹还给了明确的数据类型,js这种解释型语言只有number,估计问题更大,有机会要好好测试一波。
  3. 本篇只来及测试了部分类型和部分转换情况,后续时间充裕会慢慢补全。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【计组笔记-5】详细测试c++中类型转换的溢出截断处理 的相关文章

  • (计算机组成原理)Cache和主存之间的映射方式

    地址映射变换机构是将CPU送来的主存地址转换为Cache地址 由于贮存和Cache的块大小相同 xff0c 块内地址都是相对于快的起始地址的偏移量 xff08 即低位地址相同 xff09 xff0c 因此地址变换主要是主存块号与Cache块
  • 计算机组成原理---总线带宽的计算

    end
  • 【计算机组成原理笔记】1.2计算机的基本组成

    1 2计算机的基本组成 冯 诺依曼计算机 冯诺依曼计算机的六个特点 冯 诺依曼计算机硬件框图 各部分功能 缺点 计算机硬件框图 以存储器为中心的计算机硬件框图 现代计算机硬件框图 系统复杂性管理方法 计算机的工作步骤 指令格式举例 存储器的
  • 计算机组成原理实验三-----系统总线和具有基本输入输出功能的总线接口实验

    总线是计算机中连接各个功能部件的纽带 是计算机各部件之间进行信息传输的公共通路 总线不只是一组简单的信号传输线 它还是一组协议 他有两大特征 分时 同一总线在同一时刻 只能有一个部件占领总线发送信息 其他部件要发送信息得在该 部件发送完释放
  • 第二章 计算机发展与应用

    计算机从诞生至今已经经历了多个阶段的发展 包括 1 电子管时代 1940年代 1950年代 计算机使用电子管作为主要的电子元件 这些计算机体积庞大 功耗大 但是它们标志着计算机的诞生 并且在二战期间被广泛应用于军事领域 2 晶体管时代 19
  • 【计算机组成原理笔记】1.1计算机系统简介

    1 1计算机系统简介 计算机系统由硬件 软件两部分组成 硬件是看得到摸得到的实体 如硬盘 显卡 主板等 软件程序通常寄寓于各种媒体 如RAM ROM 磁带 光盘等 RAM 随机存取存储器 英语 Random Access Memory 缩写
  • 计算机组成原理学习笔记——六、总线

    文章目录 计算机组成原理学习笔记 六 CPU总线 6 1 总线概述 6 2 总线仲裁 6 3 总线操作和定时 6 4 总线标准 小结 计算机组成原理学习笔记 六 CPU总线 6 1 总线概述 总线的猝发传送方式 一个总线周期内传输存储地址连
  • 浮点的加减计算方法

    浮点的计算方法 1 计算步骤 2 基本要素 2 1 浮点数 2 2 规格化浮点数 2 3 偏置指数 2 4 IEEE浮点数 2 5 特点 3 计算实例 4 舍入机制 扩展 乘除计算步骤 1 计算步骤 浮点数格式 单精度 符号位1位 阶码8位
  • 补码除法运算(加减交替法)

    x 补 00 1000 除数y 补 11 0101 两个数是异号 因此使用x 补 y 补 11 1101 11 1101继续与y 补 对比 发现是同号 商上1 余数11 1101向左移动一位 再加上 y 补 结果为00 0101 余数00
  • 8.4-中断系统小结(cpu中断七个问题)

    README 本文转自bilibili 计算机组成原理 哈工大刘宏伟 的视频讲解 非常棒 墙裂推荐 1 中断介绍 1 作用 用中断系统实现了外设数据的输入输出 还可以用于程序调试 计算机系统的异常事件 都可以用中断系统来处理 2 中断因素
  • 1. 存储器分类

    存储器的分类 存储器有很多的分类依据 按存储介质 读写功能 存取方式 在计算机中的作用等 按存储介质分类 磁性介质 磁盘 磁带 光介质 光盘 半导体介质 内存 固态硬盘 内存是易失性存储器 掉电后无信息保存 固态硬盘是非易失性存储器 掉电信
  • 计算机组成原理慕课测试-第四单元

    计算机字长32位 主存容量为128MB 按字编址 其寻址范围为 0 32M 1 1 B 8b 1 kB 1024 B kB kilobajt 千 1 MB 1024 kB MB megabajt 兆 1 MB 1024 kB MB mega
  • 计算机的”性能“

    前言 性能这个词在很多领域都出现过 比如一个跑车的性能 一个家电的性能 一个电脑的性能 其实在我看来一个东西的性能 就是他在某一方法的能力 比如跑车最重要的就是速度 一个计算机则是他的运行速度 在计算机组成原理中理解计算机怎么运行 为什么要
  • 《计算机组成原理实验》 多周期CPU

    计算机组成原理实验 多周期CPU 前言 这是中山大学2018年计算机组成原理实验中多周期CPU的实验报告 仿真与写板的内容暂略 所有源代码 包括写板 已经上传至我的github当中 欢迎大家访问 github个人主页 https stara
  • 计算机组成原理--基于Logisim的汉字的表示的应用(超详细/设计/实验/作业/练习)

    目录 课程名 计算机组成原理 内容 作用 设计 实验 作业 练习 学习 基于Logisim的汉字的表示 一 前言 二 环境与设备 三 内容 四 结果与分析 课程名 计算机组成原理 内容 作用 设计 实验 作业 练习 学习 基于Logisim
  • 【计组】学习笔记1.1:8421码和ASCII码

    8421码 8421码即BCD码 由于人们习惯日常使用十进制数 而计算机处理时使用的是二进制数 而两种数制相互转换十分麻烦 因此产生了8421码映射关系 其映射运算例如 1001转化为十进制数9 1 8 0 4 0 2 0 1 8 0 0
  • 补码加减运算及判断溢出方法

    一 补码加减运算 二 判断溢出方法 1 符号位判溢出方法 对于加减运算 两个异号数相加或者两个同号数相减 结果的绝对值一定比任何一个数的绝对值要小 不会发生上溢出 两个异号数相减或者两个同号数相加的绝对值肯定比任何一个数要大 可能发生溢出
  • CF、SF、OF、ZF标志位

    没学汇编 这种题我真是做一道错一道 OF overflow flag 溢出标志位 溢出标志位 OF 1 表示带符号整数运算时结果发生溢出 对于无符号整数运算 OF没有意义 对于有符号数的溢出判断方式有 1 采用一位符号位 思想为 或 则为溢
  • 5.1 中央寄存器的原理和组成

    思维导图 中央处理器 CPU 核心原理与组成 引言 中央处理器 CPU 作为计算机的 大脑 在现代计算机硬件中扮演着至关重要的角色 本文旨在深入探讨CPU的基本原理和组成部分 为读者提供一个全面的理解 CPU的基本原理 1 信息处理 CPU
  • 5.1 中央寄存器的原理和组成

    思维导图 中央处理器 CPU 核心原理与组成 引言 中央处理器 CPU 作为计算机的 大脑 在现代计算机硬件中扮演着至关重要的角色 本文旨在深入探讨CPU的基本原理和组成部分 为读者提供一个全面的理解 CPU的基本原理 1 信息处理 CPU

随机推荐

  • 微信小程序开发--uniapp

    uniapp介绍 什么是uniapp uniapp是一个使用Vue js开发所有前端应用的框架 开发者编写一套代码 可发布到iOS Android H5 以及各种小程序 微信 支付宝 百度 头条 QQ 钉钉 淘宝 快应用等多个平台 截止20
  • 破解selenium封禁--去哪儿酒店爬虫

    使用selenium遇到封禁 selenium是我用来破解一些js渲染比较多的页面的神器 但是最近 在抓取一些网站时 遇到了让人头皮发麻的事情 selenium出问题了 在测试去哪儿酒店时 遇到了加载不出数据的问题 如下图 去哪儿会一直很努
  • linux配置nginx下载包安装的方式

    0 先卸载nginx 使用yum来卸载 yum remove nginx 查询所有nginx相关文件 逐一删除 whereis nginx rm rf 文件名或目录 1 安装编译环境 yum y install make zlib zlib
  • MQTT 连接优化指南

    博主猫头虎 带您 Go to New World 博客首页 猫头虎的博客 面试题大全专栏 文章图文并茂 生动形象 简单易学 欢迎大家来踩踩 IDEA开发秘籍专栏 学会IDEA常用操作 工作效率翻倍 100天精通Golang 基础入门篇 学会
  • 华为OD机试 - 数组去重和排序(Java)

    题目描述 给定一个乱序的数组 删除所有的重复元素 使得每个元素只出现一次 并且按照出现的次数从高到低进行排序 相同出现次数按照第一次出现顺序进行先后排序 输入描述 一个数组 输出描述 去重排序后的数组 用例 输入 1 3 3 3 2 4 4
  • redis-缓存架构-问题列表(四)

    1 缓存架构 高并发 高可用 解决方案 问题 1 如何让redis集群支撑几十万QPS高并发 99 99 高可用 TB级海量数据 企业级数据备份与恢复 redis企业级集群架构 2 如何支撑高性能以及高并发到极致 同时给缓存架构最后的安全保
  • Java如何将字符串放进字符串数组中(亲测)

    String str1 aaa String str2 bbb String str3 ccc List
  • oracle报错文件损坏,oracle 控制文件损坏处理

    一 故障模拟 控制文件损坏 发现关闭不了 强制关闭 故障恢复 发现已经执行到mont阶段 因为这个不依靠控制文件 进入整段日志 cd u01 app oracle diag rdbms orcl orcl trace 查看alert orc
  • Idea开启Run DashBoard配置

    找到 idea文件下的workspace xml 并找到RunDashboard
  • LeetCode:二叉搜索树的属性、修改与构造(12道经典题目)

    LeetCode 二叉搜索树的属性 修改与构造 12道经典题目 本文带来与二叉搜索树的属性 修改与构造有关的经典题目 主要实现是C 700 二叉搜索树中的搜索 98 验证二叉搜索树 530 二叉搜索树的最小绝对差 501 二叉搜索树中的众数
  • Java_Could not find resource SqlMapConfig.xml

    目录结构如图 解决办法 选中目录config 右键build path gt use as source folder
  • Linux中如何设置静态IP

    1 打开虚拟机编辑 gt 虚拟网络编辑器 选择VMnet8 设置子网IP 子网掩码 网关 点击确定 2 按照以下标注修改网卡的配置文件 gt 重启网络 gt 查询IP root centos7 vim etc sysconfig netwo
  • ECCO首家全球旗舰店在上海正式开业;海立马瑞利全球总部启动运营;西门子医疗完成收购瓦里安

    一周企业资讯看点 ECCO首家全球旗舰店正式开业 海立马瑞利全球总部启动运营 赛诺菲中国首个全球研究院落成启用 西门子医疗完成收购瓦里安 温德姆酒店集团计划今年大中华区新开超过100家酒店 Club Med丽江度假村预计将于今年秋天开业 三
  • Windows下在虚拟机VMware中安装Ubuntu 18.04(一个安装了很多次Ubuntu的详细步骤和经验,避免踩不必要的坑)

    我安装了ubuntu很多次 以前在网上学习了很多版本的安装步骤 以前经验不足 出现了很多问题 比如说 学习过程中出现内存或磁盘不足 而且有时候无法扩展或扩展很麻烦 这很浪费时间和降低学习效率 甚至Ubuntu有时会很卡 启动慢 我觉得最严重
  • ag-grid基本配置

    columnDefs headerName 序号 必填 显示在表头的文本 width 50 宽度 minWidth 300 最小宽度 多数情况是在自适应时 设置使用 maxWidth 300 最大宽度 多数情况是在自适应时 设置使用 cel
  • 设计模式(一) 工厂方法模式

    介绍 关于设计模式 大家可能已经有很多了解了 因此这里直接开始吧 首先来介绍一下工厂方法模式 它是一种创建型模式 在设计模式 可复用面向对象软件的基础中对工厂方法由如下的解释 工厂方法模式的实质是 定义一个创建对象的接口 但让实现这个接口的
  • Intellij IDEA中使用Protobuf的正确姿势

    1 proto文件语法高亮显示 需要安装Protobuf Support插件 依次点击Intellij中的 File gt Settings gt Plugins gt Browse repositories 如下所示 输入Protobuf
  • eclipse中将项目打包成jar,并启动

    第一种 利用eclipse中自带的export功能 第一种方法分两种情况先来看第一种情况 没有引用外部jar的项目打包 步骤一 右键点击项目选择导出 export 选择java gt jar文件 不是选择可运行jar文件 步骤二 选择你要导
  • python3.7 解决古代计算题--牛刀小试

    首先来看下题目 今有物不知其数 三三数之剩二 五五数之剩三 七七数之剩二 问物几何 第一代 print 今有物不知其数 三三数之剩二 五五数之剩三 七七数之剩二 问物几何 n number int input 请输入你认为符合条件的数字 i
  • 【计组笔记-5】详细测试c++中类型转换的溢出截断处理

    计组笔记 5 详细测试c 中类型转换的溢出截断处理 1 将小数赋值给float 2 将整数赋值给float 3 将整数赋值给int 3 1 算术溢出 3 2 非算术溢出 等于32位 3 3 非算术溢出 大于32位 4 将小数赋值给int 5