C/C++中整数加法/减法的溢出问题

2023-11-14

    C/C++中的整数类型有short、int、long等,这些整数类型均为有符号整型,即二进制最高位位符号位,相应的无符号整型只需要在各类型前面加上unsigned,如unsigned int等。现在有如下程序,其输出结果会是多少呢?

short x = 0x7fff;  //最大的有符号整数
short y = x + 2;   //溢出
short z = y - 2;   //溢出
unsigned short a = 0xffff; //最大的无符号整数
unsigned short b = a + 2; //溢出
unsigned short c = b - 2; //溢出
cout<<"y="<<y<<endl;
cout<<"z="<<z<<endl;
cout<<"b="<<b<<endl;
cout<<"c="<<c<<endl;

    输出结果如下:

x=32767
y=-32767
z=32767
b=1
c=65535

    现在来分析上述结果,首先明确对于短整型short而言,长度为2字节,即16位。那么有符号位时其最小为-2^15,最大为 2^15-1, 而无符号位时,最小为0,最大为2^16-1。
    由于x+2的结果超出了所能表示的最大整数,因此他输出了-32767,我们可以这样来理解,因为计算机中的加法是通过补码来实现的,x的补码是0x7fff(正数的补码等于原码),2的补码等于(0x0002),所以y=x+2=0x8001,这说明y的补码是一个符号位为1,其余各位均为0的补码,其实它就是0xffff=-32767的补码。同理z=y-2=0x7fff,它是32767的补码。
    由于b=a+2=0xffff+0x0002=0x0001=1,所以其结果为1;而c=b-2=0x0001-0x0002=-1,因为-1的补码是0xffff,而无符号整数没有符号位,那么-1的补码就等于c的原码,所以c=0xffff。
    简言之,对于有符号整型相加时,若溢出,如0x7ff9+8=-2^15+1, 0x7ffe+6=-2^15+5 ;相减时,若溢出,如-32766-5=32767-2。
    同理,对于无符号整型相加时,若溢出,如0xffff+2=0+1;相减时,若溢出,如0-2=0xffff-1;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C/C++中整数加法/减法的溢出问题 的相关文章

  • 群G及群运算

    定义 一个 非空集合G中 如果定义了 一个 乘法 运算 元素的二元运算 满足以下四个性质 那么该非空集合G称为群 封闭性 a b G a b c G 结合律 a b c G a b c a b c 单位元 e G a G e a a e a
  • hadoop初级到资深

    hadoop初级到资深 2015 06 13 12 08 165人阅读 评论 0 收藏 举报 分类 hadoop 3 1 hadoop是什么 适合大数据的分布式存储与计算平台 2 hadoop版本有哪些 Apache 官方版本 1 1 2

随机推荐

  • 数据库表结构设计方法及原则

    在目前的企业信息系统中 数据库还是最佳的数据存储方式 虽然已经有很多的书籍在指导我们进行数据库设计 但应该那种方式是设计数据库的表结构的最好方法 设计时应遵从什么样的原则 四个范式如何能够用一种方式达到顺畅的应用等是我一直在思考和总结的问题
  • 计算机组成原理(海明码效验)(3)-软件设计(二十四)

    计算机组成原理 2 软件设计 二十三 https blog csdn net ke1ying article details 129394115 一 总线 分为 内部总线 系统总线 外部总线 内部总线 指芯片级别的总线 连接各个芯片 系统总
  • 广义线性模型——Logistic回归模型(1)

    广义线性模型 GLM 是线性模型的扩展 它通过连接函数建立响应变量的数学期望值与线性组合的预测变量之间的关系 广义线性模型拟合的形式为 其中g Y 是条件均值的函数 称为连接函数 另外 你可放松Y为正态分布的假设 改为Y 服从指数分布族中的
  • 12-git-pycharm配置.ignore文件

    pycharm配置 ignore文件 前言 安装插件 使用 添加其他忽略文件 前言 在开发中经常需要配置提交git的忽略文件 本篇来学习下使用pycharm自动生成 ignore文件 安装插件 Files gt setting gt Plu
  • 基于区块链技术的电子病历研究----2019年5月份

    FJTCM区块链技术开发学习小组 时间 2019 05 31 基于区块链技术的电子病历研究 摘 要 提出了一种基于区块链技术的新型分布式电子病历记录管理系统 系统为患者提供了一个全面的 不可变的日志 并且可以方便地访问其医疗信息 利用独特的
  • JQuery隐藏、添加select的option

    需求 级联查询 根据前一个select选择的值 动态改变后一个select的值 页面效果大致如下 代码 ul li p 设备类型 p li ul
  • MySQL 数据库

    MySQL 数据库 概念 数据 所谓数据 Data 是指对客观事物进行描述并可以鉴别的符号 这些符号是可识别的 抽象的 它不仅仅指狭义上的数字 而是有多种表现形式 字母 文字 文本 图形 音频 视频等 现在计算机存储和处理的数据范围十分广泛
  • Vue 3.0双向绑定原理的实现

    proxy方法 vue js 是采用数据劫持结合发布者 订阅者模式的方式 通过new Proxy 来劫持各个属性的setter getter 在数据变动时发布消息给订阅者 触发相应的监听回调 Vue 3 0与Vue 2 0的区别仅是数据劫持
  • Python while循环语句语法格式

    视频版教程 Python3零基础7天入门实战视频教程 初始化语句 while 循环条件 循环体 迭代语句 初始化语句 一条或多条语句 用于完成一些初始化工作 初始化语句在循环开始之前执行 循环条件 这是一个布尔表达式 这个表达式能决定是否执
  • 主板电源接口示意图_台式电脑主板的接口线及安装细节图解

    如果你是玩台式电脑用户 那么你肯定知道 电脑最麻烦的就是主板上的接口了 稍有不慎接错线主板就会烧毁 因此这是一个很重要的环节 今天小编就来给大家介绍主板上的接口都是些什么 该怎么接 01 认识主板供电接口 在主板上 我们可以看到一个长方形的
  • 实证论文|数据处理问题合集

    目录 1stata 如何留下至少有连续5年的观测 2stata如何剔除13年及以后公司样本 python 3stata如何根据文本数据生成新数据 4如何将季度数据处理为年度数据 5如何根据分位数划分组别 6如何将省份划分为东中西部地区 7出
  • Java-1.9

    题目描述 编写程序 显示宽为4 5 高为7 9的矩形的面积和周长 代码 public class Rectangle public static void main String args final double width 4 5 he
  • Spring之refresh的12个步骤

    根据B站黑马视频总结 1 refresh的12个步骤 prepareRefresh obtainFreshBeanFactory prepareBeanFactory postProcessBeanFactory invokeBeanFac
  • python中lambda语法格式及实例

    Python 3中的Lambda函数的语法格式如下 lambda 参数列表 表达式Lambda函数以关键字lambda开始 后面是参数列表 参数列表可以包含任意数量的参数 但只能有一个表达式 参数列表的语法和函数定义的参数列表语法相同 可以
  • RTC实时时钟实验(低功耗、纽扣电池供电)

    目录 I MX6U RTC 简介 硬件原理分析 实验程序编写 修改文件MCIMX6Y2 h 编写实验程序 编译下载验证 编写Makefile 和链接脚本 编译下载 实时时钟是很常用的一个外设 通过实时时钟我们就可以知道年 月 日和时间等信息
  • LayaBOX添加颜色滤镜

    初始化舞台 Laya init 1334 750 Laya WebGL 设置舞台背景色 Laya stage bgColor ffffff 原始位图 createImg 100 50 红色滤镜 creteRedFilter 灰色滤镜 cre
  • linux 调试技术

    本文讨论了四种调试Linux程序的情况 在第1种情况中 我们使用了两个有内存分配问题的样本程序 使用MEMWATCH和 Yet AnotherMallocDebugger YAMD 工具来调试它们 在第2种情况中 我们使用了Linux中的s
  • 打造自己的专属--VSCode主题(仿HBuilderX绿柔主题配色)

    打造自己的专属 VSCode主题 theme Hx LR主题 介绍 习惯了HBuilderX的主题 再使用VSCode的主题就感觉到有点儿不适应 所以就搜索 修改 然后就心满意足了 哈哈 当然HBuilderX和VSCode并没有好坏之分
  • Lua使用Vector容器

    一 编写vector pkg class vector TOLUA TEMPLATE BIND T string CCSprite 添加我们想要的容器类型 void clear int size const const T operator
  • C/C++中整数加法/减法的溢出问题

    C C 中的整数类型有short int long等 这些整数类型均为有符号整型 即二进制最高位位符号位 相应的无符号整型只需要在各类型前面加上unsigned 如unsigned int等 现在有如下程序 其输出结果会是多少呢 short