计算机为什么使用补码来存储数据

说明:以下讨论,都是用8位来存储的数据类型:char类型,

为什么?为什么用补码呢?我反复思考着,后来在王爽的汇编语言里和网上找到了答案,有如下总结:

原码表示的数:

原码的数出现0,和-0的两个码!我们知道-0== 0;所以0000 0000,1000 0000两个码会表示同一个数!

8位数据可以表示-127~127的254个有符号数。但是理论上8位数据是可以表示255中不同信息的。

反码表示的数

:

同样反码也只能表示-127~127的254个有符号数。0出现重码。

补码表示的数

:

补码可以表示-128~127的255个有符号数;

补码的特性

不仅如此,补码还有很多特性,这些特性为符号数的运算提供了方便。(而且有些特新“原码”和“反码”是不具备的)

补码定义:正数的补码与原码相同;负数的补码是对其原码逐位取反,但符号位除外;然后整个数加1。

[X]补:表示X的补码

|X|:表示X的绝对值

当X < 0 时[X]补 = 2~8 - |X|;

当X >=0 时[X]补 = |X| =X;

1)  [X+Y]补 = [X]补 +[Y]补

2)  [X-Y]补 = [X]补 - [Y]补 = [X]补 + [-Y]补

3)  [X*Y]补=[X]补*[Y]补 (乘数(被乘数)相乘的补码等于补码的相乘。)

4)  正数的补码取反加1后,为其对应的负数的补码;负数的补码取反加1后为其绝对值的补码。

即:X>=0:[ [-X]补 ]补 = |X| = X

X<0 [ [X]补]补 = |X| = -X

等等……

我尝试着证明了其中一个特性: [X+Y]补 = [X]补 +[Y]补

(1)设:X>=0,Y>=0;-àX+Y>=0

所以[X+Y]补=X+Y;[X]补=X;[Y]补=Y;

所以[X+Y]补 = [X]补 +[Y]补

(2)设:X<0,Y<0;àX+Y<0 且|X|+|Y| = |X+Y|

[X+Y]补 = 2^8-|X+Y|;[X]补=2^8-|X|;[Y]补=2^8-|Y|;

[X]补+[Y]补 = 2^8-(|X|+|Y|)+2^8;

因为只有8位表示而且还有一位是符号位所以(|X|>=0&&|X|<2^7)&& (|Y|>=0&&(|Y|<2^7)à|X|+|Y|<2^8)所以2^8-(|X|+|Y|)>0

所以2^8-(|X|+|Y|) +2^8将会溢出一位(因为只有8位存储数据),所以2^8-(|X|+|Y|)+2^8 =2^8-(|X|+|Y|)  = 2^8-(|X+Y|) = [X+Y]补

(3)设X>=0,Y<0

[X]补+[Y]补 =|X| +2^8-|Y| = 2^8 +(|X|-|Y|)

3-1)再设|X|>|Y|à(|X|-|Y|>0且X+Y>0)由于只有8位来存储数据,会溢出一位,所以2^8+(|X|-|Y|) = |X|-|Y| = X+Y(因为X>=0 ,Y<0)

因为X+Y>0所以[X+Y]补 = X+Y=[X]补+[Y]补;

3-2)再设|X|<=|Y|à(|X|-|Y|<=0 且 X+Y<=0)所以[X+Y]补=2^8 - |X+Y| = 2^8+X+Y=2^8+|X|-|Y|=[X]补+[Y]补;

综上可得出: [X+Y]补 = [X]补 +[Y]补

自己证明的,也许有错误,如果有错,望指教!

计算机数值类型的数据为什么以补码表示,计算机为什么使用补码来存储数据相关推荐

  1. 目前最常用的计算机机箱类型为_目前最常用的计算机机箱类型为

    大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答. 截止2020年4月,目前市场目前最常用的计算机机箱类型为是AT.ATX以及最新的BTX.ATX机箱是目前最常见的机箱,BTX是最新 ...

  2. python3的pyqt5 qtablewidget按数据大小排列_InnoDB为什么要选择B+树来存储数据?

    关于InnoDB索引,我们可能知道InnDB索引是用B+树实现的,而B+树就是一种能优化查询速度的数据结构.但我们又没想过这样一个问题,能优化查询速度的数据结构有很多,为什么InnoDB要采用B+树? ...

  3. 关于计算机硬盘的详细分类及不同硬盘存储数据的方式

    文章目录 计算机硬盘的发展历史 标志性历史事件 后续发展 现存主要硬盘制造商 计算机硬盘分类 按照运行模式,存储介质和结构分类 按照硬盘接口类型分类 计算机硬盘储存数据的基础知识和原理 机械硬盘 机械 ...

  4. php mysql存储中文为空_PHP如何解决MySQL存储数据中文乱码

    PHP如何解决MySQL存储数据中文乱码?本文主要介绍了PHP+MySQL存储数据常见中文乱码问题,针对php+mysql常见的中文乱码问题予以总结分析,并给出了解决方法供大家参考.需要的朋友可以参考 ...

  5. 【Revit二次开发】模型中存储数据——参数和外部存储(Parameter, Schema and Entity)

    模型中存储数据 参数 读取 写入 外部存储 Schema Entity 快速获取外部存储参数 参数 在Revit平台API中,每个图元对象都有参数属性,它是隶属于图元所有属性的集合,在此集合中更改属性 ...

  6. html存储数据的方法,数据存储方式有哪些

    数据存储方式:1.顺序存储方法,结点间的逻辑关系由存储单元的邻接关系来体现.2.链接存储方法,结点间的逻辑关系由附加的指针字段表示.3.索引存储方法.4.散列存储方法,根据结点的关键字直接计算出该结点 ...

  7. STM32 --- 使用内部FLASH存储数据

    本文记录了对一些知识点的理解.操作方法,如有错误,请务必批评指正!! 最终的测试截图: 目录​ 一.内部FLASH要点 关于地址: 关于解锁: 关于擦除: 关于写入: 二.读取数据 三.存储数据 四. ...

  8. Java数值类型与补码关系讨论

    随着学习计算机知识的加深,许多地方都遇到原码.反码.补码.很多关于计算机的书籍都介绍原码.反码.补码的表示方法,但是为什么要用到原码.反码.补码却没详细说.为什么要使用?我们知道数值在计算机中表示形式 ...

  9. 漫画:为什么计算机用补码存储数据?

    作者 | 漫话编程 来源 | 漫话编程(ID:mhcoding) 我们知道,计算机只认识0和1,现实世界中的内容,无论是文字.音频.视频等等想要通过计算机存储.计算或者展示,都需要转换二进制. 就像你 ...

最新文章

  1. 获取用户电脑的上网IP地址
  2. 眼图在通信系统中有什么意义_悟空CRM:施行CRM系统对汽车行业有什么意义
  3. IS-IS 的 DIS (伪节点) 及 DIS 和 OSPF中DR 的区别
  4. python编程例子 输入 输出-推荐 :手把手教你用Python创建简单的神经网络(附代码)...
  5. OpenGL程序演示
  6. .net生成excel并弹出保存提示框(转载)
  7. How do annotations work internally--转
  8. 数据结构一:链表(单向链表)
  9. OpenCV各向异性图像分割anisotropic image segmentation的实例(附完整代码)
  10. Redis底层实现--字符串
  11. linux软raid 系统坏了,LINUX下软RAID的制造及如何查看坏盘?
  12. 游戏 Npk文件解压
  13. webpack ——css兼容性处理
  14. 幼儿-综合素质【6】
  15. 游戏显示无法连接服务器怎么回事,Game Center无法连接服务器怎么办 五种方法任你选择...
  16. CAD学习笔记中级课【CAD快捷键】
  17. 3Dmax基础:游戏建模渲染小技巧
  18. 1072: 青蛙爬井 Java
  19. 幻影机器人庄园讲解员_探索之旅——莘城海粟幼儿园秋游活动
  20. 2022中国移动源环境管理年报(附下载)

热门文章

  1. Html卡片属性,HTML5 带立体标签的说明卡片
  2. 华为p6android os耗电严重,华为手机耗电严重?那你肯定不知道这4个技巧,彻底解决...
  3. lower_bound()
  4. ●BOZJ 3144 [Hnoi2013]切糕
  5. 关于Https的加密过程理解
  6. 已解决raise XLRDError(FILE_FORMAT_DESCRIPTIONS[file_format]+‘; not supported’)
  7. 怎么调解计算机休眠不断网,怎么设置Win7不待机 Win7进入待机状态会断网的解决方法...
  8. 适合新手小白学习的web前端自学路线图整理
  9. 【小5说基础】微信小程序,清除图片缓存
  10. 手机或者邮箱登陆 mysql查询语句