二进制补码(求23的8位二进制补码)
二进制的补码怎么算?
-85负就是1,然后计算正85:+85的原码(1010101)→按位取反(0101010)→加1(0101011)
10101011(2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。
【例2】求-7的补码。
因为给定数是负数,则符号位为“1”。
后七位:+7的原码(0000111)→按位取反(1111000)→加1(1111001)
所以-7的补码是11111001。
二进制补码是什么意思?
二进制补码简介:
计算机只能识别0和1,使用的是二进制,而在日常生活中人们使用的是十进制,为了能方便的与二进制转换,就使用了十六进制(2 4)和八进制1.数值有正负之分,计算机就用一个数的最高位存放符号(0为正,1为负).这就是机器数的补码了。
补码的设计目的:
⑴使符号位能与有效值部分一起参加运算,从而简化运算规则.
⑵使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计 所有这些转换都是在计算机的最底层进行的,而在我们使用的汇编、C等其他高级语言中使用的都是原码。
小数和分数的补码:
1.十进制分数补码可以先将分子和分母分别表示成二进制数,然后计算出二进制小数,再按下面第三步的方法将求出小数的补码形式。
37/64=100101B/2^6=0.100101B
-51/128=110011B/2^7=0.0110011B
2.十进制小数的补码也应该先将其转换成二进制小数,再按下面第三步的方法将求出小数的补码形式。
0.375=0.011B
0.5625=0.1001B
3.将二进制小数对应的补码求出
[37/64]补码=[0.100101B]补码=0.1001010B
[-51/128]补码=[0.0110011B]补码=1.1001101B
[0.375]补码=[0.011B]补码=0.0110000B
[0.5625]补码=[0.1001B]补码=0.1001000B
二进制 补码
沿着由原码到补码的路子,-128 是很难办的。
因为在八位码长下,原码和反码的范围,都只有-127~+127。
就是说:-128 并没有原码和反码。
那么“求反加一”就没有用武之地。
同样,由-128的补码求出原码,也是不可能的。
-------------------------
那么,-128 的补码,是怎么来的?
求补码,有正经的公式:
当 X = 0,[ X ]补 = X;
如 X 0,? ?[ X ]补 = X + 2^n,n 是位数。
因此:[-128]补 = -128 + 2^8
? = 128
? = 1000 0000 (二进制)
二进制补码怎么计算的
1、正数的补码表示:
正数的补码 = 原码
负数的补码 = {原码符号位不变} + {数值位按位取反后+1} ? ?or
= {原码符号位不变} + {数值位从右边数第一个1及其右边的0保持不变,左边安位取反}
以十进制整数+97和-97为例:
+97原码 = 0110_0001b
+97补码 = 0110_0001b
-97原码 ?= 1110_0001b
-97补码 ?= 1001_1111b
2、纯小数的原码:
纯小数的原码如何得到呢?方法有很多,在这里提供一种较为便于笔算的方法。
以0.64为例,通过查阅可知其原码为0.1010_0011_1101_0111b。
操作方法:
将0.64 * 2^n 得到X,其中n为预保留的小数点后位数(即认为n为小数之后的小数不重要),X为乘法结果的整数部分。
此处将n取16,得
X = 41943d = 1010_0011_1101_0111b
即0.64的二进制表示在左移了16位后为1010_0011_1101_0111b,因此可以认为0.64d =?0.1010_0011_1101_0111b 与查询结果一致。
再实验n取12,得
X = 2621d = 1010_0011_1101b 即?0.64d =?0.1010_0011_1101b,在忽略12位小数之后的位数情况下,计算结果相同。
3、纯小数的补码:
纯小数的补码遵循的规则是:在得到小数的源码后,小数点前1位表示符号,从最低(右)位起,找到第一个“1”照写,之后“见1写0,见0写1”。
以-0.64为例,其原码为1.1010_0011_1101_0111b
则补码为:1.0101_1100_0010_1001b
当然在硬件语言如verilog中二进制表示时不可能带有小数点(事实上不知道哪里可以带小数点)。
4、一般带小数的补码
一般来说这种情况下先转为整数运算比较方便
-97.64为例,经查询其原码为1110_0001.1010_0011_1101_0111b
笔算过程:
-97.64 * 2^16 = -6398935 =?1110_0001_1010_0011_1101_0111b,其中小数点在右数第16位,与查询结果一致。
则其补码为1001_1110_0101_1100_0010_1001b,在此采用?负数的补码 = {原码符号位不变} + {数值位按位取反后+1} ?方法
5、补码得到原码:
方法:符号位不动,幅度值取反+1?or符号位不动,幅度值-1取反
-97.64补码 =?1001_1110(.)0101_1100_0010_1001b
取反?? ? ?=?1110_0001(.)1010_0011_1101_0110b
+1 ???? ? ?=?1110_0001(.)1010_0011_1101_0111b 与查询结果一致
6、补码的拓展:
在运算时必要时要对二进制补码进行数位拓展,此时应将符号位向前拓展。
-5补码 = 4'b1011 = 6'b11_1011
ps.原码的拓展是将符号位提到最前面,然后在拓展位上部0.
-5原码 = 4‘b’1101 = 6'b10_0101,对其求补码得6'b11_1011,与上文一致。
扩展资料:
计算机中的符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。