首先需要知道:二进制补码表示的正数实际上左侧有无限多个0,而负数有无限多个1.只是为了适应硬件的宽度,二进制表示的数的前导位被隐藏了。

举例

下面看一下64位的 −4ten-4_{ten}−4ten​的补码(以64位机器(机器里面存的是补码)为例):

00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000100two=[4]补00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000100_{two}=[4]_{补}00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000100two​=[4]补​
11111111,11111111,11111111,11111111,11111111,11111111,11111111,11111100two=[−4]补11111111,11111111,11111111,11111111,11111111,11111111,11111111,11111100_{two}=[-4]_{补}11111111,11111111,11111111,11111111,11111111,11111111,11111111,11111100two​=[−4]补​
下标two表示二进制,下标ten表示十进制。

我们把[−4]补[-4]_{补}[−4]补​和[4]补[4]_{补}[4]补​相加会得到什么呢?

[−4]补+[4]补=00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000100two+11111111,11111111,11111111,11111111,11111111,11111111,11111111,11111100two=1,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000100two[-4]_{补}+[4]_{补}=00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000100_{two}\\+11111111,11111111,11111111,11111111,11111111,11111111,11111111,11111100_{two}\\=1,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000100_{two} [−4]补​+[4]补​=00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000100two​+11111111,11111111,11111111,11111111,11111111,11111111,11111111,11111100two​=1,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000100two​
我们发现 64位补码相加得到2642^{64}264!

下面求8位的 −4ten-4_{ten}−4ten​的补码

已知 有符号数 −4ten=10000100two-4_{ten}=10000100_{two}−4ten​=10000100two​,

根据口诀:负数的补码=负数的原码取反(符号位不变,数据位取反)+1
可以得到:[−4]补=11111011two+00000001two=11111100two[-4]_{补}=11111011_{two}+00000001_{two}=11111100_{two}[−4]补​=11111011two​+00000001two​=11111100two​,

而4ten4_{ten}4ten​的补码仍然是原码,即[4]补=00000100two[4]_{补}=00000100_{two}[4]补​=00000100two​,

我们把[−4]补[-4]_{补}[−4]补​和[4]补[4]_{补}[4]补​相加会得到什么呢?

[−4]补+[4]补=11111100two+00000100two=1,00000000[-4]_{补}+[4]_{补}=11111100_{two}+00000100_{two}=1,00000000[−4]补​+[4]补​=11111100two​+00000100two​=1,00000000

我们发现 8位补码相加得到282^{8}28!

归纳

二进制补码得名于下述规则:一个n位的数与其n位的相反数做无符号加法,结果为2n2^n2n,因此,x的相反数(或相补数)-x 等于2n−x2^n-x2n−x,或叫“二进制补码”。

以n=8位为例,1的二进制表示为00000001,则 -1的二进制补码可以由上面的公式写出来
[−1]补=2n−1=28−1=1,00000000−00000001=11111112−00000001=11111111[-1]_补=2^n-1=2^8-1=1,00000000-00000001=11111112-00000001=11111111[−1]补​=2n−1=28−1=1,00000000−00000001=11111112−00000001=11111111
注:这里11111112仅仅是方便计算,实际二进制中逢二进一,还是100000000.

同样的,我们来看-128的情况。

对于128ten=27=10000000128_{ten}=2^7=10000000128ten​=27=10000000 ,这里的n=8,根据补码的定义:

[−128]补=28−128=1,00000000−10000000=11111112−10000000=10000000[-128]_{补}=2^8-128=1,00000000-10000000=11111112-10000000=10000000[−128]补​=28−128=1,00000000−10000000=11111112−10000000=10000000

综上,求1个负数(-x)的补码,只需要用2n−x2^n-x2n−x即可,这里的n表示这个负数的二进制位数。注意这里x是正数

后记:这个问题在《计算机组成与设计-硬件/软件接口》一书中有详细的解释。

为什么-1的补码是全1(11111111)?-128的补码是10000000?相关推荐

  1. 设机器数字长为8位(含1位符号位在内),写出对应下列各真值的原码、补码和反码。 -26/128,82

    疫情天天在家上网课 发现知识他不进脑子啊 突然发现自己作业不会写了 然后恶补 计算机真值.原码.反码.补码.移码 假设机器存储数字字长是8位. 图截图于https://blog.csdn.net/fi ...

  2. 为什么-128的补码是1000 0000?

    这个问题并不是什么面试题,而是今晚刚上大一初学C语言的小辈问我的,一瞬间竟然有点发蒙,不知道该如何回答.好在最后还是理清了思路,顺便将这个非常基础的知识点总结下吧. 我们都知道,表示二进制有符号数有三 ...

  3. -128的补码及原码、反码、补码

    一.原码 一个字节占8位: 一个字长为n的机器数能表示不同的数字的个数是固定的2^n个,n=8时2^n=256: 用来表示有符号数,数的范围就是 -2^(n-1) ~ 2^(n-1)-1,n=8时,这 ...

  4. c语言补码计算方法,探讨C语言学习中补码计算方法.doc

    探讨C语言学习中补码计算方法 探讨C语言学习中补码计算方法 摘要:补码是C语言学习中的一个重点和难点,如何能够快速准确地计算出各个数的补码值得我们探讨.本文从补码的意义入手,采用逆向逻辑思维,分别提出 ...

  5. 计算机采用补码存储数据吗,为什么计算机用补码存储数据?

    来自公众号:漫话编程 关于作者:漫话编程,是一个通过漫画+音频的形式讲解枯燥的编程知识的公众号.致力于让编程变得更有乐趣. img img img img img img img 我们知道,计算机只认 ...

  6. C语言符号位补码要变吗,C语言关于补码的解释及误区

    加法器 计算机里面,只有加法器,没有减法器,所有的减法运算,都必须用加法进行. 即:减去某个数字(或者说加上某个负数)的运算,都应该研究如何用加法来完成. 模.补数 在日常生活当中,可以看到很多这样的 ...

  7. 原码、反码、补码,带你深入理解计算机的补码运算原理(附图片解说过程),为什么计算机中数据要以补码的形式存储呢?解释补码运算规则的合理性。

    一.为什么计算机中的数据以补码的形式存储? 计算机更擅长加法运算,减法运算是在计算机处理器的加法器的基础上而实现的,既然计算机更擅长加法运算,那么计算机的设计者当然就只能在加法器的基础上引入" ...

  8. c语言原码 补码 反码,C语言 原码--反码--补码

    //原码,反码,补码 #include #include //数值的表示方法--原码.反码和补码 //原码:最高位为符号位,其余各位为数值本身的绝对值 //反码: //正数:反码与原码相同 //负数: ...

  9. 计算机中补码能算减法的原因和补码的由来,最强逻辑解析

    ** 原码.反码.补码: ** 这里的码都是二进制码,正数的原码.反码和补码都一样,负数的反码是符号位不变,其它位都取反,补码是反码+1 正数的符号位为0,负数的符号位为1,比如你有一个字节,也就是8 ...

最新文章

  1. ccc计算机比赛如何报名,整理:加拿大的CCC是什么,怎么报名?
  2. 安全之美(英文影印版)
  3. 000-SQL Server
  4. Linux学习一:(Bash 常用命令、vim操作、Linux框架目录)
  5. tiny4412初期环境搭建
  6. 7z001怎么解压在安卓手机上面_安卓zip文件压缩RAR解压手机下载-安卓zip文件压缩RAR解压v1.0最新版下载...
  7. Java如何封装参数_java规范(一)------方法设计---返回多参数的方法怎么封装
  8. 1900页Python系列PPT分享一:基础知识(106页)
  9. 前端必须要有的学习能力
  10. python地理数据处理相关的操作
  11. 大数据大屏设计-PS拉框助手
  12. c语言图书管理系统出现的问题,C语言图书管理系统中的问题
  13. 服务器维保价格标准_标准维护服务方案
  14. 2020年中国半导体划片机行业现状分析,国产替代+需求扩张,行业前景广阔「图」
  15. 英特尔oneAPI—开拓
  16. python如何判断用户的电话属于移动、联通、还是电信的
  17. oracle 有iif么,ORACLE IIF声明
  18. n阶魔方的构成方法C语言,穷举法打印n阶魔方矩阵
  19. 西安华为OD面试体验
  20. 同花顺_代码解析_技术指标_O

热门文章

  1. iOS经常使用加密方式(MD5,AES,BASE64)与网络数据安全
  2. 李开复给中国学生的第六封信:选择的智慧
  3. python网络安全宣传周_Python
  4. CNDO-INTGRL-SS-AINTGS-斯莱特轨道指数
  5. linux 虚拟仪器,linux平台下编写虚拟仪器系统设计
  6. 2.11 向量化-深度学习-Stanford吴恩达教授
  7. 【频谱分配】基于频谱空洞预留算法的频谱分配算法的matlab仿真
  8. 资本主义的历史仍未终结(作者:袁剑)【转】
  9. esxi添加网卡驱动
  10. 03、Swagger2和Springmvc整合详细记录(爬坑记录)