原码.反码.补码,计算机中负数的表示

原码:将一个整数,转换成二进制,就是其原码。如单字节的5的原码为:0000 0101;-5的原码为1000 0101。

反码:正数的反码就是其原码;负数的反码是将原码中,除符号位以外,每一位取反。如单字节的5的反码为:0000 0101;-5的反码为1111 1010。 补码:正数的补码就是其原码;负数的反码+1就是补码。如单字节的5的补码为:0000 0101;-5的原码为1111 1011。

在计算机中,正数是直接用原码表示的,如单字节5,在计算机中就表示为:0000 0101。负数用补码表示,如单字节-5,在计算机中表示为1111 1011。 这儿就有一个问题,为什么在计算机中,负数用补码表示呢?为什么不直接用原码表示?如单字节-5:1000 0101。

我想从软件上考虑,原因有两个

1、表示范围

拿单字节整数来说,无符号型,其表示范围是[0,255],总共表示了256个数据。有符号型,其表示范围是[-128,127]。

先看无符号,0表示为0000 0000,255表示为1111 1111,刚好满足了要求,可以表示256个数据。

再看有符号的,若是用原码表示,0表示为0000 000。因为咱们有符号,所以应该也有个负0(虽然它还是0):1000 0000。

那我们看看这样还能够满足我们的要求,表示256个数据么?

正数,没问题,127是0111 1111,1是0000 0001,当然其它的应该也没有问题。

负数呢,-1是1000 0001,那么把负号去掉,最大的数是111 1111,也就是127,所以负数中最小能表示的数据是-127。

这样似乎不太对劲,该如何去表示-128?貌似直接用原码无法表示,而我们却有两个0。

如果我们把其中的一个0指定为-128,不行么?这也是一个想法,不过有两个问题:一是它与-127的跨度过大;二是在用硬件进行运算时不方便。

所以,计算机中,负数是采用补码表示。如单字节-1,原码为1000 0001,反码为1111 1110,补码为1111 1111,计算机中的单字节-1就表示为1111 1111。

单字节-127,原码是1111 1111,反码1000 0000,补码是1000 0001,计算机中单字节-127表示为1000 0001。

单字节-128,原码貌似表示不出来,除了符号为,最大的数只能是127了,其在计算机中的表示为1000 0000。

2、大小的习惯(个人观点)

也可以从数据大小上来理解。还是以单字节数据为例。有符号数中,正数的范围是[1,127],最大的是127,不考虑符号为,其表示为111 1111;最小的是1,不考虑符号为,其表示为000 0001。

负数中,最大的是-1,我们就用111 1111表示其数值部分。后面的数据依次减1。减到000 0001的时候,我们用它标示了-127。再减去1,就变成000 0000了。还好我们有符号为,所以有两个0。把其中带符号的0拿过来,表示-128,刚好可以满足表示范围。

原码:将一个整数,转换成二进制,就是其原码。如单字节的5的原码为:0000 0101;-5的原码为1000 0101。

反码:正数的反码就是其原码;负数的反码是将原码中,除符号位以外,每一位取反。如单字节的5的反码为:0000 0101;-5的反码为1111 1010。 补码:正数的补码就是其原码;负数的反码+1就是补码。如单字节的5的补码为:0000 0101;-5的原码为1111 1011。

在计算机中,正数是直接用原码表示的,如单字节5,在计算机中就表示为:0000 0101。负数用补码表示,如单字节-5,在计算机中表示为1111 1011。 这儿就有一个问题,为什么在计算机中,负数用补码表示呢?为什么不直接用原码表示?如单字节-5:1000 0101。

我想从软件上考虑,原因有两个

1、表示范围

拿单字节整数来说,无符号型,其表示范围是[0,255],总共表示了256个数据。有符号型,其表示范围是[-128,127]。

先看无符号,0表示为0000 0000,255表示为1111 1111,刚好满足了要求,可以表示256个数据。

再看有符号的,若是用原码表示,0表示为0000 000。因为咱们有符号,所以应该也有个负0(虽然它还是0):1000 0000。

那我们看看这样还能够满足我们的要求,表示256个数据么?

正数,没问题,127是0111 1111,1是0000 0001,当然其它的应该也没有问题。

负数呢,-1是1000 0001,那么把负号去掉,最大的数是111 1111,也就是127,所以负数中最小能表示的数据是-127。

这样似乎不太对劲,该如何去表示-128?貌似直接用原码无法表示,而我们却有两个0。

如果我们把其中的一个0指定为-128,不行么?这也是一个想法,不过有两个问题:一是它与-127的跨度过大;二是在用硬件进行运算时不方便。

所以,计算机中,负数是采用补码表示。如单字节-1,原码为1000 0001,反码为1111 1110,补码为1111 1111,计算机中的单字节-1就表示为1111 1111。

单字节-127,原码是1111 1111,反码1000 0000,补码是1000 0001,计算机中单字节-127表示为1000 0001。

单字节-128,原码貌似表示不出来,除了符号为,最大的数只能是127了,其在计算机中的表示为1000 0000。

2、大小的习惯(个人观点)

也可以从数据大小上来理解。还是以单字节数据为例。有符号数中,正数的范围是[1,127],最大的是127,不考虑符号为,其表示为111 1111;最小的是1,不考虑符号为,其表示为000 0001。

负数中,最大的是-1,我们就用111 1111表示其数值部分。后面的数据依次减1。减到000 0001的时候,我们用它标示了-127。再减去1,就变成000 0000了。还好我们有符号为,所以有两个0。把其中带符号的0拿过来,表示-128,刚好可以满足表示范围。


相关文章

  • 二进制中正负数表示和判断
  • 二进制中第一位0代表正:1代表负我知道,但是给你一个二进制的数比如101 那么转化成十进制应该是多少? 5? 但不是说首位为1应该是负的吗??? 谁能给我讲讲这个首位什么时候作为符号,什么时候作为数字去计算?什么时候可以直接计算,什么时候需 ...查看


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


  • 二进制表示法 0,-128的补码详解
  • 补码表示法(0, -128详解) 阅读原文点击(csdn 博文) 关于计算机内部定点整数表示方法,有很多种文章都有总结,但是仍然不能很好地解决初学者的困惑,为此在这里用图表说明一下 1.这里以8个二进制位为例,实际上计算机内部有16位(2字 ...查看


  • 信息的表示与存储
  • 1.4信息的表示与存储 计算机加工的对象是数据信息,而指挥计算机操作的是控制信息,因此计算机内部的信息可以分成二大类: ┌ 指令 ┌ 控制信息 ─┤ │ └ 控制字 信息 ┤ │ ┌ 定点数 │ ┌ 数值信息 ─┤ └ 数据信息 ─┤ └ ...查看


  • 八位二进制数为什么表示范围是
  • 八位二进制数为什么表示范围是:-128~~+127 计算机对带符号数的表示有三种方法:原码.反码和补码 8位原码和反码能够表示数的范围是-127~127 8位补码能够表示数的范围是 -128~127 所以既然范围是-128~127,那肯定是 ...查看


  • 8位有符号数的表示范围
  • 为什么8位有符号数的范围是"-128 至 +127" 这是一个困惑了我几年的问题, 它让我对现在的教科书和老师极其不满, 从我 N 年前开始摸电脑时, 就几乎在每一本C++教科书上都说,8 位有符号的取值范围 是-128 ...查看


  • 关于二进制的原码反码补码
  • 关于二进制的 原码 反码 补码 关于二进制的原码反码补码 原码 例如 7 原码00000111= 2的2次方(第三位)+2的1次方(第二位)+1=7 十进制转换二进制 判断 2的三次方>7>2的2次方 所以最高位超过第二位没超过 ...查看


  • 2016年计算机四级考试嵌入式工程师考试题及答案
  • 2016年计算机四级考试嵌入式工程师考试题及答案 本文为大家整理日工的是计算机嵌入式系统考试题,希望对大家有所帮助! (1)进位计数制与转换:这样比较简单,也应该掌握怎么样进行换算,有出题的可能. (2)计算机中数的表示:源码.反码与补码. ...查看


  • 计算机组成与结构重点
  • 一.第一章 1.习题1.5如何划分计算机发展的五个阶段 根据电子计算机所采用的物理器件的发展,分为五代: 第一代:电子管计算机时代 第二代:晶体管计算机时代 第三代:集成电路计算机时代 第四代:大规模集成电路计算机时代 第五代:超大规模集成 ...查看


热门内容