首先,你要记住并且不要问为什么:“在计算机中,所有的数据,最终都是使用二进制数表达的。

还要记住并且不要问为什么:“在计算机中,正数是直接用原码来表示和存储的。

要记住并且不要问为什么:“在计算机中,负数是以它的补码(即它的反码+1)来表示和存储的。

对于允许是负数的数值(称为带符号的数值),必须先确定一个固定的长度(换言之,就是二进制数的位数),再把最左边的最高位设置为符号位。必须固定位数,这样才能避免符号位与其他位的混淆。

只要知道每个数值的位数,就可以找到符号位,它应是最左边的那一位。如果符号位是0,该数值就是正的;如果它是1,该数值就是负的。

⑴原码表示法规定:套用十进制的思路,用最左边的最高位来表示该数的符号位(0表示正数,1表示负数),剩余的其他位数用来表示该数的绝对值。(关键:理解符号位其他位数

原码:一个整数,按照其绝对值大小转换成二进制数,并在最左边的最高位用0或1来表示其正负,称为原码。

例①:正数 5 的原码是:0000 0101。

而负数 -5 的原码是:1000 0101。

反码:将原码,除符号位外的其他位数每一位按位取反,所得到的新的二进制数,称为反码。(口诀:符号位不变其他位取反

⑵反码表示法规定:零、正数的反码与原码相同,负数的反码为对该数的原码除符号位外每一位取反。

例②:正数 5 的反码与原码相同:0000 0101。

而负数 -5 的原码是:1000 0101,对该数的原码除符号位外每一位取反,得到反码:1111 1010。

补码:反码加1,称为补码。(口诀:符号位不变其他位先取反再加1

⑶补码表示法规定:零、正数的补码与原码相同,负数的补码为对该数的原码除符号位外每一位取反,然后在最后一位加1。

例③:正数 5 的补码与原码相同:0000 0101。

而负数 -5 的原码是:1000 0101,对该数的原码除符号位外每一位取反,然后在最后一位加1,得到补码:1111 1011。

所以,在计算机中,负数 -5 是以它的补码(即它的反码+1):1111 1011 来表示和存储的。

不管是正数还是负数,其反码或补码的最高位,都是和原码的最高位一样!(请看原码表示法的规定,还有反码表示法和补码表示法的规定!)

因为,正数的反码或补码,都是与原码相同,所以最高位是不变的。

因为,负数的反码或补码,都是在原码的基础上,保持最高位不变,其他位数每一位取反,甚至在最后一位加1。

以上都是教我们,把我们熟悉的十进制的正数或负数,转化成计算机熟悉的二进制的数:

(十进制:原码->符号位不变,先取反->反码->再加1->补码)

那反过来,看到计算机熟悉的二进制的正数或负数,如何转换成我们熟悉的十进制的数?

(补码->先减1->反码->符号位不变,再取反->原码:十进制)

首先,要知道该二进制数的最高位:如果最左边的最高位(即符号位)为0则是正数,为1则是负数。

  二进制的正数,要转换成十进制,请先将其写成“加权系数展开式”,然后用“按位权相加”法,即可转换成十进制。

  二进制的负数,要转换成十进制,首先要理解上面的“在计算机中,负数是以它的补码(即它的反码+1)来表示和存储的”这句话的精髓,然后反过来逆推(符号位不变其他位先减1再取反):

例⑤:十进制的 -10 在原码表示法里,其原码是:1000 1010;对该数的原码除符号位外每一位取反,得到反码:1111 0101,然后在最后一位加1,得补码:1111 0110。

反过来逆推,二进制的 1111 0110(可理解为已知补码),先减1,得出(反码):1111 0101;除符号位外每一位取反,得出(原码):1000 1010;它在原码表示法里,最高位1表示负数,剩余的其他位数表示该数的绝对值,得:-10。

再看看逆推过程:

1111 0110

先     -1

---------

1111 0101

再取反:

---------

1000 1010 = 在原码表示法里,最高位1表示负数,剩余的其他位数表示该数的绝对值,得:-10。

(这是按照补码的原理来逆推原码。相当于只有0点和6点的钟,原来在0点,逆时针拨可到6点)

试试对该二进制数求补码:

1111 0110

先取反:

---------

1000 1001

再     +1

---------

1000 1010 = 用原码表示法来理解,也是十进制中的 -10。

原码取反加1得补码补码取反加1也得出原码。这是抖机灵。相当于只有0点和6点的钟,原来在0点,顺时针拨也可到6点)

如果已知补码求原码,可将补码过程逆推(即符号位不变,其他位先减1再取反)即得到原码,亦可将该补码再求补码(即符号位不变,其他位先取反再加1)也能得到原码

  其实,看到某个二进制数,你可以理解为已经知道补码,只需用上面定律⑸求出原码,最后将原码转换成十进制,不就行了?

一个二进制数,如果每位取反(最高位符号位也取反,所以不是反码),取反得到的值和原来的值,相加等于-1。(不是0,也不是1)

  所以,求某个二进制数取反的值,可用:-1-(该二进制数的值),即该二进制数的值的相反数减1。

原码、反码、补码的使用

计算机中有三种编码方式表示一个数。

正数的三种编码都是相同的。如:

+1 = 0000 0001 [原码] = 0000 0001 [反码] = 0000 0001 [补码]

负数的三种编码都是不同的。如:

-1 = 1000 0001 [原码] = 1111 1110 [反码] = 1111 1111 [补码]

只有原码才是可以直接被识别并且用于计算方式 ,那么反码和补码的作用又是什么?

人脑在进行计算的时候可以知道第一位是符号位,在计算的时候会根据符号位选择对真值的加减。

对于计算机来说,加减乘除是最基础的运算,要尽量设计的简单,计算机辨别出 符号位 会使得计算机的基础电路设计变得更加复杂,所以人们想出了将符号位也参与运算的方法。

减去一个正数等于加上一个负数,即 2-1 = 2+(-1),所以机器只有加法而没有减法。符号位参与运算,只保留加法运算。

(一)原码运算:

十进制的运算:1-1=0

1-1=1+(-1) = 0000 0001 [原码] + 1000 0001 [原码] = 1000 0010 [原码] = -2

如果用原码表示,让符号位也参与计算,对于减法来说,结果显然是不正确的,所以计算机内部不使用原码来表示一个数字。

(二)反码运算:

为了解决原码做减法的问题,就引出了反码

十进制的运算:1-1=0

1-1=1+(-1) = 0000 0001 [原码] + 1000 0001 [原码] = 0000 0001 [反码] + 1111 1110 [反码] = 1111 1111 [反码] = 1000 0000 [原码] = -0

使用反码计算减法,结果的真值部分是正确的,但是在 ‘0’这个特殊的数值上。虽然 +0和 -0在意义上是一样的,但是0加上符号是没有任何意义的,0000 0000[原码] 和1000 0000[原码] 这两个编码都表示0。

(三)补码运算:

补码的出现,解决了 0 的符号以及两个编码的问题。

十进制的运算:1-1 =0

1-1=1+(-1) = 0000 0001 [原码] + 1000 0001 [原码] = 0000 0001 [补码] +  1111 1111[补码] = 0000 0000[补码] = 0000 0000[原码] = 0

这样 0 用 [0000 0000] 表示 ,而以前出现问题的 -0 就不存在了,而且可以用 [1000 0000] 表示 -128

(-1) + (-127) = 1000 0001[原码] + 1111 1111[原码] = 1111 1111[补码] + 1000 0001[补码] = 1000 0000[补码] = -128

-1-127 的结果应该是 -128,在用补码运算的结果中,1000 0000[补码] 就是-128,但是注意因为实际上使用 -0 的原码来表示 -128,所以 -128并没有补码和反码表示。

使用补码,不仅是修复了 0的符号以及存在两个编码问题,而且还能多表示一个最低数。

注意:

1、所以8 位的二进制,使用原码或是反码表示的范围为 [-127,+127],使用补码表示的范围为 [-128,127];

2、常用的32 位二进制,使用补码表示的范围为  [-231, 231-1] ,这是因为第一位表示的是符号位,使用补码表示时又可以多保存一个最小值。

五、原码、反码、补码算术运算

(一)反码的算术运算

反码的运算注意问题:

1、反码运算时,符号位与数值一起参与运算;

2、反码的符号位相加后,如果有进位产生,就要·把进位送回到最低位相加(循环进位);

3、用反码运算,其运算结果也为反码。在转换为真值时,若符号位为0,数位不变;若符号位为1,应将结果求反才是其真值。

[例1] 已知X = + 1101 , Y = + 0110 , 用反码计算Z = X-Y。

解: [X]反 = 01101,[-Y]反 = 11001,则[Z]反 =[X]反+[-Y]反 = 01101+11001+1(循环进位)= 00111 , 其真值为Z = +0111。

[例2] 已知X = + 0110 , Y = + 1101 , 用反码计算Z = X-Y。

解: [X]反 = 00110,[-Y]反 = 10010,则[Z]反 =[X]反+[-Y]反 = 00110 + 10010= 11000 , 其真值为Z = - 0111。

采取反码运算较好的解决了原码运算所遇到的困难或问题,但由于循环进位需要二次算术相加,延长了计算时间,这同样给电路带来麻烦。

而采用下述的补码运算则可避免循环进位的两次计算,同时,采用补码运算对溢出的判断也较采用反码简单的多,所以机器中的算术运算普遍采用补码运算

(二)补码的算术运算

补码要注意的问题:

1、补码运算时,其符号位与数值部分一起参加运算

2、补码的符号相加后,如果有进位的出现,需要将这个进位舍去(自然丢失)

3、用补码运算,其运算结果也是补码。在转换为真值时,若符号位为 0,数位不变;若符号位为1,应将结果求补才是其真值。

[例3] 已知X = + 1101 , Y = + 0110 , 用补码计算Z = X-Y。

解: [X]补 = 01101,[-Y]补 = 11010,则[Z]补 =[X]补+[-Y]补 = 01101+11010= 100111 , 其真值为Z = + 0111。

[例4] 已知X = + 0110 , Y = + 1101 , 用补码计算Z = X-Y。

解: [X]补 = 00110,[-Y]补 = 10011,则[Z]补 =[X]补+[-Y]补 = 00110 + 10011= 11001 , 其真值为Z = - 0111。

(三)溢出及补码溢出的判断

无论采取什么机器,只要运算的结果大于数值设备所能表示数的范围,就会产生溢出。溢出现象应该当成是一种故障来处理,因为它使结果数产生错误。

异号两数相加时,实际是两数的绝对值相减,不可能产生溢出,但有可能出现正常进位;

同号两数相加时,实际上是两数的绝对值相加,既可能产生溢出,也可能出现正常进位。

[例5] 某数字设备用五位二进制表示数,计算

(1)9+3 (2)-9-3 (3)9+12 (4)-9-12

解:(1)[+9]补+[+3]补= 01001+ 00011 = 01100 = +12 正确;

(2)[-9]补+[-3]补= 10111+ 11101 = 110100 = 10100(符号位进位自然丢失),其真值为-1100 = -12正确;

(3)[+9]补+[12]补= 01001 + 01100 = 10101 其真值为-1011 =-11错误,产生了溢出;

(4)[-9]补+[-12]补 = 10111+10100 = 101011 其真值为01011= +11 错误,产生了溢出。

(1)、(2)两题结果均正确,查其最高位和次高位的进位位,不是均无进位产生,就是均产生进位;(3)、(4)两题结果均错误,查其最高位和次高位的进位位,只有一位产生了进位。此即为判断机器是正常进位还是溢出的基本依据,在微型机中可用异或电路来实现上述的判断。

reference

https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html

https://www.cnblogs.com/nyw1983/p/11887220.html

第三讲,我们来谈谈:“二进制的负数”相关推荐

  1. 为什么地磅的读数有进制么_谈谈二进制(三)——位运算及其应用

    0. 概要 前两篇文章我们了解了二进制的基本原理(谈谈二进制(一))以及二进制的四则运算(谈谈二进制(二)),本篇我们一起来看看二进制的位运算.先来看一下有哪些位运算: 上表中列出了我们编程语言中的所 ...

  2. 二进制正负数的表示法

    数在数字电路中的二进制表示形式成为机器数,在通常的算术运算中,用"+"."-"表示正数和负数,而数字电路不识别"+","-&quo ...

  3. 计算机进制中负数对应的二进制,十进制负数转换为二进制、八进制、十六进制的知识分享...

    搜索热词 程序猿们或许对二进制都不陌生,二进制是计算技术中广泛采用的一种数制.二进制数据是用0和1两个数码来表示的数.但是很多人都会将二进制转换成整数,但是如何用二进制表示负数呢?有的人会说,在二进制 ...

  4. Python基础入门之二进制的负数

    刚刚介绍了位运算符,里面涉及到了二进制的运算,出现了a = 60,~a = 1100 0011 = -61的计算,所以这里记录一下二进制的负数表示和计算. 二进制是计算技术中广泛采用的一种数制.二进制 ...

  5. 二进制 正数 负数 源码反码补码

     二进制的正负数 . HEX (十六进制) EA                        EA Oct(十进制)      有符号                   无符号 -22       ...

  6. 计算机系统基础知识——详解二进制正负数及补码设计

    前言:关于二进制数的补码反码等各种码,上学时候只学会了死记硬背却还是一头雾水,不懂这样设计的意义.所以总是隔很多时间后还是记不住,今天就尝试用自己的理解解释下正负数以及补码的设计,如果有不对的地方或者 ...

  7. 二进制与或非逻辑计算机,深度学习(1):给感知机做准备,谈谈二进制和与或非门。...

    过去的五年,人工智能已经是最热门的话题,从理论的完善到实践工具的丰富.慢慢发现,AI已不再是专属于实验室的一种研究,每一个对此有兴趣的人都能自己动手在自己的电脑上完成属于自己的研究.本系列文章希望从零 ...

  8. 二进制表示负数的方法:“ 补数 ”

    在十进制中表示正负数会有专门的符号来区分,而在二进制中,怎样表示正负数呢??? 在二进制中表示负数时,一般会把位权的最高位上的数字作为符号来使用,因此,位权的最高位也称为符号位. 符号位为 0,表示正 ...

  9. 二进制正负数转换和移位的规则详解

    1.转换规则 二进制整数都是以补码的形式出现的 正数的原码.反码.补码都相同 负数的反码就是正数的原码先把最高位变为1然后其余的位取反 负数的补码就是该负数的反码加1. 2.二进制的移位规则 < ...

最新文章

  1. java web一: xml
  2. flink启动命令参数_Flink集群部署
  3. 开源 协作工具_使用HackMD在开源项目上进行协作
  4. OpenShift 4 - 配置OpenShift可使用的外部Image Registry和Mirror Registry
  5. [转载] HTML所有标签及其属性汇总
  6. 查询数据进行排名,一样的并列
  7. 三、Oracle 游标、存储过程、存储函数、触发器
  8. APP-Android:APK
  9. 不同计算机的操作码完全相同,单片机课后习题答案
  10. 博弈论中的几个经典问题
  11. php解密encrypteddata,PHP解密支付宝小程序的加密数据、手机号的示例代码
  12. 阿里中台搞了3年,搞凉了?网传:副总裁玄难“背锅”,辞职创业!
  13. X-Cash空投领取教程
  14. 仿QQ好友列表,QListWidget!
  15. 君子慎独,卑以自牧!
  16. 吉尔布雷斯的动作研究——《可以量化…
  17. s=s+1和s+=1的区别
  18. 古龙群侠传 服务器维护,古龙群侠传常见问题解答(2)
  19. 百度宣布开放其输入法的应用程序接口
  20. oracle12的dbca,Oracle 12.2 DBCA 使用 Silent 建库

热门文章

  1. GitHub 大热!也许会成为你心中的OCR开源工具NO1!
  2. 计算机教育中缺失的一课 · the missing semester of your cs education
  3. 每日一皮:有人质疑新疫苗的免疫率低?
  4. 每日一皮:这是个有趣的妹子...
  5. 技术选型之Docker容器引擎
  6. 提升系统 10 倍性能的 10 个建议!
  7. 一口气带你踩完五个 List 的大坑!
  8. Spring Boot 2.x基础教程:默认数据源Hikari的配置详解
  9. 全局稳定性收敛平衡点为0吗_「模型解读」GoogLeNet中的inception结构,你看懂了吗...
  10. Window10下Ubuntu20.04子系统下安装cuda