google了一下,看到了这样一篇文章,注意到文中关于补码来历的描述,可以总结如下:

  1. 计算机里面,只有加法器,没有减法器,所有的减法运算,都必须用加法进行。
  2. 用补数代替原数,可把减法转变为加法。出现的进位就是模,此时的进位,就应该忽略不计。
  3. 二进制下,有多少位数参加运算,模就是在 1 的后面加上多少个 0。
  4. 补码就是按照这个要求来定义的:正数不变,负数即用模减去绝对值。

补充解释一下“模”的概念(不准确):

考虑时钟上时间的计算,假设现在时针指向数字3,若问“6小时前时针指向的数字是几”,则可以:

1. 将时针逆时针拨动6格。

2. 将时针顺时针拨动12 - 6 = 6格。

两者的结果是一样的。这里称12为“模”。

故有 3时 - 6个小时 = 3时 + (12 - 6个小时),这里可以看到将减法转换成加法的过程,即“加上模减去绝对值的差”。

所以,假设模是10,有效位数为1,当我们计算 9 - 7 的时候:

9 - 7 => 9 + (10 - 7) = 12,去掉最高的位后,得到2,这是正确的结果。

作者的意思是说,计算机里面所有数都以补码形式保存,加减运算都是补码之间的加法运算。然后作者提出了一个我之前没听过

的观点:

补数 和 补码的定义式 里面,根本就没有什么符号位。这最高位的1、0是自然出现的,并不是由人来规定的。

的确,符号位在补码运算里面是“模”,本身并不带符号的意义。因为计算机将加法转换成加上一个“负数”,而负数又以补码的形式

表现。补码比源码多一位,从这多出来的一位可以推断出原来数字的正负号,所以成为了符号位。也可以这样认为,留出一位

(不全部占满)的原因是要用“模”来表示正负数。

也就是说,不是特意留出一个符号位,用1和0来表示正负号。而是补码运算可以用最高位来表示正负,所以符号位诞生了。

那么为什么-128的补码是10000000?可以这样理解。-128是一个负数,所以它的补码是它的“模”减去它的绝对值,即:

100000000 - 10000000 = 10000000

那么为什么负数补码等于源码的反码加一呢?可以这样推导:

100000000 - 10000000
= (11111111 + 00000001) - 10000000
= 11111111 - 10000000 + 1
= 01111111 + 1 //反码加一
= 10000000

由此我们得知,在计算机里面所有的数字都以补码形式存储。127存成01111111,-127存成11111111,算减法就变成算加法了,

尽管你看到的是“-”号。

数字在自然界中抽象出来的时候,一棵树,两只猪,是没有正数和负数的概念的

计算机保存最原始的数字,也是没有正和负的数字,叫没符号数字

如果我们在内存分配4位(bit)去存放无符号数字,是下面这样子的

后来在生活中为了表示“欠别人钱”这个概念,就从无符号数中,划分出了“正数”和“负数”

正如上帝一挥手,从混沌中划分了“白天”与“黑夜”

为了表示正与负,人们发明了"原码",把生活应该有的正负概念,原原本本的表示出来

把左边第一位腾出位置,存放符号,正用0来表示,负用1来表示

但使用“原码”储存的方式,方便了看的人类,却苦了计算机

我们希望 (+1)和(-1)相加是0,但计算机只能算出0001+1001=1010 (-2)

这不是我们想要的结果 (╯' - ')╯︵ ┻━┻

另外一个问题,这里有一个(+0)和(-0)

为了解决“正负相加等于0”的问题,在“原码”的基础上,人们发明了“反码”

“反码”表示方式是用来处理负数的,符号位置不变,其余位置相反

当“原码”变成“反码”时,完美的解决了“正负相加等于0”的问题

过去的(+1)和(-1)相加,变成了0001+1110=1111,刚好反码表示方式中,1111象征-0

人们总是进益求精,历史遗留下来的问题—— 有两个零存在,+0 和 -0

我们希望只有一个0,所以发明了"补码",同样是针对"负数"做处理的

"补码"的意思是,从原来"反码"的基础上,补充一个新的代码,(+1)

我们的目标是,没有蛀牙(-0)

有得必有失,在补一位1的时候,要丢掉最高位有得必有失,在补一位1的时候,要丢掉最高位

我们要处理"反码"中的"-0",当1111再补上一个1之后,变成了10000,丢掉最高位就是0000,刚好和左边正数的0,完美融合掉了

这样就解决了+0和-0同时存在的问题

另外"正负数相加等于0"的问题,同样得到满足

举例,3和(-3)相加,0011 + 1101 =10000,丢掉最高位,就是0000(0)

同样有失必有得,我们失去了(-0) , 收获了(-8)

以上就是"补码"的存在方式

结论:保存正负数,不断改进方案后,选择了最好的"补码"方案

原码、反码、补码的产生、应用以及优缺点有哪些?相关推荐

  1. 关于计算机中 原码, 反码, 补码 详解

    本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...

  2. 原码, 反码, 补码, 移码 详解

    本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...

  3. 关于 原码 反码 补码 位运算

    二进制 原码:最高位为符号位,0为正  1为负 正数的原码 反码 补码 都是相同的 反码:负数的反码为原码符号位不变 其它对应变化(1变0 0变1) 补码:等于 反码+1 3^-3 =? 运算过程 - ...

  4. 10.原码 反码 补码

    +7的原码:0000 0111 -7的原码:1000 0111   第一位0代表正数,1代表负数,第一位为符号位 +7的反码:0000 0111 正数反码和原码一样 -7的反码:1111 1000   ...

  5. java进制原码_Java 一一 进制、原码 反码 补码、移位操作

    进制 二进制 和 十进制 相互转换 十进制 和 十六进制 相互转换 原码,反码,补码 原码.反码.补码: 在计算机内, 有符号数有三种表示法: 原码, 反码, 补码. 所有的数据的运算都是采用 补码 ...

  6. 大端 小端 原码 反码 补码 及内存中的表现

    小端 和 大端 在内存中存储时,都是从内存的低地址往高地址存,即0x00000000 -> 0xffffffff 以汉字 "严"为例,Unicode码是4E25,需要两个字节 ...

  7. 原码 反码 补码 详解

    一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1.机器数 一个数在计算机中的二进制表示形式,  叫做这个数的机器数.机器数是带符号的,在计算机用一个数的最高位存放 ...

  8. python二进制反码例题_python中的进制转换和原码,反码,补码

    python中的进制转换和原码,反码,补码 计算机文件大小单位 b = bit 位(比特) B = Byte 字节 1Byte = 8 bit #一个字节等于8位 可以简写成 1B = 8b 1KB ...

  9. 原码 反码 补码 详解

    本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...

  10. 【原码, 反码, 补码的基础概念和计算方法】

    数值在计算机中是以补码的方式存储的,在探求为何计算机要使用补码之前, 让我们先了解原码, 反码和补码的概念. 原码就是符号位加上数字的二进制表示, 即用第一位表示符号, 其余位表示值. 反码的表示方法 ...

最新文章

  1. python2 队列的使用_python双端队列原理、实现与使用方法分析
  2. 深入剖析Redis RDB持久化机制
  3. Spring Cloud构建微服务架构:服务注册与发现(Eureka、Consul)【Dalston版】
  4. Openstack 与VMware 不同CPU迁移原理
  5. html 如何去除浮动,CSS浮动? 如何清除浮动?
  6. RUNOOB python练习题 32 列表的中括号符号小tips
  7. java EE : tomacat 基础
  8. 如何获得CSDN深色模式(基于Edge的强制深色获取)
  9. 日本定了一个小目标,在2030年让五分之一的汽车实现自动驾驶
  10. 妙趣横生的算法(C语言实现 第2版)pdf
  11. 电子购物网站设计—1
  12. android gson json解析,Android GSON 解析 JSON
  13. Linux LittlevGL 使用
  14. www.idcnd.net传媒官方客服提供
  15. 使用阿里云的ip地址查询服务-购买ip地址查询服务
  16. 不朽的浪漫网站服务器,浪漫人族TOD专访 虫族强大让我震惊
  17. linux 下简单安装 pathogen.vim
  18. HTML的style属性(替代font等标签)
  19. 黑苹果驱动]Mac OS X Snow Lepard的内核功能扩展kext大致解析
  20. MySQL数据库的基本操作-创建(create database)、选择(use)、查看(shows database)、删除(drop database)

热门文章

  1. MySQL触发器使用详解
  2. java笔记之抽象类和接口
  3. OpenCV在Python上的调用( import cv2的解决办法)
  4. 在Hadoop 2.3上运行C++程序各种疑难杂症(Hadoop Pipes选择、错误集锦、Hadoop2.3编译等)
  5. VC获取其他进程ListCtrl内容
  6. 一键实现变老变年轻——Windows 10 下部署PaddleGAN,带你感受从年少到白头的浪漫
  7. 吴恩达深度学习课程deeplearning.ai课程作业:Class 4 Week 4 Face Recognition for the Happy House
  8. python dlib学习(八):训练人脸特征点检测器
  9. qtmessagebox对话框里自定义按钮文本_Word里表格都是这么来的 — 生成绘制表格有技巧...
  10. Fedora 与 Ubuntu 深度比较