首页 > 其他分享 >原码、反码、补码的理解

原码、反码、补码的理解

时间:2024-06-17 21:54:08浏览次数:20  
标签:反码 0001 补码 1111 0000 原码

概念

机器数、真值

  • 机器数

一个数在计算机中的二进制表示形式,叫做这个数的机器数。机器数是带符号的,在计算机用机器数的最高位存放符号,正数为0,负数为1。

比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是0000 0011。如果是 -3 ,就是 100 00011 。

那么,这里的 0000 0011 和 1000 0011 就是机器数。

  • 真值

因为第一位是符号位,所以机器数的形式值就不等于真正的数值。

例如上面的有符号数 1000 0011,其最高位1代表负,其真正数值是 -3,而不是形式值131(1000 0011转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。

例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1

原码、反码、补码

原码、反码、补码是机器存储一个具体数字的编码方式。机器数包含了原码、反码、补码的表示形式。

  • 原码

原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值。比如:如果是8位二进制:

[+1]原= 0000 0001

[-1]原= 1000 0001

第一位是符号位,因为第一位是符号位,所以8位二进制数的取值范围就是:(即第一位不表示值,只表示正负。)

[1111 1111 , 0111 1111]

[-127 , 127]

  • 反码

反码的表示方法是:

正数的反码是其本身;

负数的反码是在其原码的基础上,符号位不变,其余各个位取反。

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

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

可见如果一个反码表示的是负数,人脑无法直观的看出来它的数值。通常要将其转换成原码再计算。

反码表示在计算机中往往作为数码变换的中间环节。

  • 补码

补码的表示方法是:

正数的补码就是其本身;

负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1。(也即在反码的基础上+1)

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

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

对于负数,补码表示方式也是人脑无法直观看出其数值的。通常也需要转换成原码再计算其数值。

为什么用反码和补码

计算机辨别"符号位"显然会让计算机的基础电路设计变得十分复杂,所以要把对于负数的减法运算转成加法运算。

将钟表想象成是一个1位的12进制数。例如钟表上的时间为6点,如果我们希望将时间设置为4点,那么我们可以将钟表往回拨2个小时,即“-2”,或者我们可以将钟表往前拨10个小时,即“+10”

  1. 往回拨2个小时:6 - 2 = 4
  2. 往前拨10个小时:(6 + 10)mod 12 = 4

这样就将减法计算转成了加法计算。

类似钟表,计算机中的数值也是有一定范围的,所以同样可以将计算机中的减法运算改为加法运算,即将真值为负的机器数转为补码形式再做加法,实际上是将负数转换成了这个它的同余数(概念自行百度)

补码举例:

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

如果把[1111 1111]当成原码,去除符号位,则[0111 1111]原 = 127

相当于

2-1 ≡ 2+127 (mod 128)

到底什么是补码

所以到底什么是补码?

其实负数的补码等于反码+1只是补码的求法,而不是补码的定义,很多人以为求补码就要先求反码,其实并不是,那些计算机学家并不会心血来潮的把反码+1就定义为补码,只不过补码正好就等于反码+1而已。

其实负数的补码,是能够和其相反数相加通过溢出从而使计算机内计算结果变为0的二进制码。这是补码设计的初衷,具体目标就是让1+(-1)=0,这利用原码是无法得到的:

0001(1) + 1001(-1) = 1010(-2)

而在补码中:

0001(1补) + 1111(-1补) = 10000(1溢出)

所以对于一个n位的负数-X,有如下关系

X + (-X) = 100...0(n个0) = 2n

假设寄存器是n位的,那么-X的补码应该是2n - X的二进制编码

例如:

X = - 0b11(-3) ,四比特表示原码 = 1011(11),对应反码为 = 1100(12),补码为1101(13);
如果寄存器4位,-3对应的补码二进制数为13,刚好是24-3

正十进制数X补码等于其本身,n位寄存器下-X的补码等于2n-X对应的二进制编码。

已知补码如何求原码

二进制

补码的补码就是原码

十进制

n位寄存器下-X的补码等于2n-X对应的二进制编码。

(1)十进制的情况下,如果给的补码是无符号数2n-X,那么原码即(2n-X) - 2n = -X:
例如前面-3补码无符号数是13,对应的原码就是13-24=-3

(2)十进制的情况下,如果给的补码是有符号数-Y,对应的无符号数就是2n-1 + Y,那么原码就是(2n-1 + Y)- 2n=Y-2n-1:
例如前面-3补码有符号数是-5,对应的原码就是5-23 = -3

参考

原码、反码、补码
二进制的原码、反码、补码
补码的计算方法

标签:反码,0001,补码,1111,0000,原码
From: https://www.cnblogs.com/fattree/p/18253291

相关文章

  • 在算力充足的未来,计算机中的负数还有必要使用补码表示吗
    补码(Two'sComplement)表示法在计算机科学中广泛使用,主要是因为它的几个优点:在补码表示法中,加法、减法和乘法都可以使用相同的硬件电路实现,这大大简化了硬件设计。使用补码表示法,当两个正数相加导致结果超出范围时,会得到一个负数(表示上溢),这可以被程序捕获并处理。在补码表示......
  • 对补码的简单理解
    在学C时,对补码很困惑,通过学习,我的感悟是:溢出如果一个内存空间只能存放0~9中的一位数,那就会出现这样的现象:9+9=8,9+9+9=7,9+9+9+9=6,因为这些结果出现了进位,进位又被舍弃了,所以留在个位的数会减小。结果加9的操作得到的是减1的结果,因为加了一个9,舍弃了一个10,多舍弃的这个1,是来......
  • 原/反/补码与位运算的基础概念
    零、参考资料计算机组成原理系列(一):浅谈计算机中的“补码”计算机系统#3为什么计算机中的负数要用补码表示?Under-One、一些技术概念机器数与真值真值:在日常的书写习惯中,往往用正、负号加绝对值表示数值,用这种形式表示的数值为真值。例如100D,-50D,-76O等机器数:在计......
  • 补码
    计算机基础(补码)原码也叫符号-绝对值码最高位0表示正数1表示负数,其余二进制位是该数字的绝对值 原码简单易懂加减运算复杂存在加减乘除四种运算,增加了CPU的复杂度零的表示不唯一反码反码运算不便,也没有在计算机中应用移码表示数值平移n位,n称为移码量移码主要用于浮......
  • 低开销求补码电路
    电路里经常用补码来表示有符号整数,求一个负数的补码表示最直接的方法是将对应的正数取反再加1。如果要写一个参数化的求补码的模块,则代码如下:modulecal_complement#(parameterWIDTH=8)(input[WIDTH-1:0]din, output[WIDTH-1:0]dout); assigndout=~(di......
  • 【数据结构】链表(单链表实现+详解+原码)
    目录【数据结构】链表(单链表实现+详解+原码)【数据结构】链表(单链表实现+详解+原码)代码:#include<math.h>usingnamespacestd;typedefstructnode{ intdata; structnode*next;}NODE;intmain(void){ NODEa,b,c; NODE*p; a.data=1; a.next=&b;......
  • [计组] 计算机编码方式:原码、反码、补码
    原码、反码和补码是计算机中用来表示带符号整数的三种编码方式,它们在计算机内部的运算和表示过程中发挥重要作用。在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。1计算机编码方式:原码/反......
  • 原码、移码、反码、补码
    对于数字0来说,移码和补码都是唯一的 +5-5原码0_000_01011_000_0101反码0_000_01011_111_1010(原码负数取反)补码0_000_01011_111_1011(反码+1)移码1_000_01010_111_1011(符号位取反的补码)......
  • 大一下 计算系统基础笔记:原码的一位乘法 20240402
    W61.原码的一位乘法原码的一位乘法可以通过以下步骤进行:1.确定乘法的两个操作数,并将它们转换为原码表示。2.对两个操作数的每一位进行相乘,得到部分积。3.将所有的部分积相加,得到最终的乘积。具体的步骤如下:假设有两个操作数A和B,都用原码表示,长度为n位。1.确定符号位:根据A......
  • 【深度解析】计算机组成原理:8位二进制数的原码、反码与补码表示及溢出处理实例
    #自用笔记引言在计算机系统中,数值的内部表示是其基础组成原理的核心部分。尤其对于有符号整数而言,原码、反码和补码的运用极大地简化了运算过程,并有效地解决了负数表示问题。本文将深入探讨8位二进制数下这三种编码方式的规则,同时通过具体示例分析溢出现象及其解决办法。一......