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表示“负”,而数值位,三种表示方法各不相同。
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
在计算机系统中,数值,一律采用补码表示和存储。
计算机中的算术运算,也是用补码来运算的。
因为,在计算机中,只有加法器。
所以,补码的运算,也就只有:加法运算。
补码的运算规则,也就只有:逢二进一。
补码的运算规则,就是:逢二进一。
补码,它本来就是一个【代替负数】的正数。
取反加一,只不过是个【障眼法】而已。
也不仅是二进制用补码运算,任何进制,都有“补码”的。
你看十进制,两位数,就是:0 ~ 99。
可以有:27 + 99 = (一百) 26
也可以:27 - 1 = 26
如果你忽略进位,依然保持两位数,那么:
--正数,就能当负数来用;
--加法,也就能完成减法运算。
如果在计算机舍弃进位,会怎样?
--计算机中,就全是正数了。
--负数没有了,减法运算也没有了。
--减法器,也就没有了用武之地。
--计算机只需配置一个加法器,便可横行天下!
----------------------
看到了吗?
--只要你舍弃了进位,正数就能代替负数!
补码,并不是来自取反加一。
--【舍弃进位】,才是补码的来源和存在意义!
----------------------
两位十进制时,舍弃进位,就是减去一百 (10^2)。
那么,加上 99,再减去 100,必然就是“-1 ”!
------
八位二进制数则是:0000 0000 ~ 1111 1111。
换算到十进制,即:0 ~ 255。
出现了进位,就是:2^8 = 256。
------
那么,加上 255 (1111 1111),再减 256,不也是-1 吗?
同理,254 (1111 1110),就能代替-2。
。。。
最后,128 (1000 0000),就代表-128 了。
这些个正数,就是计算机专家 “发明” 的补码。
----------------------
其实,补码,不需要谁来发明!
也不用取反加一!
当你舍弃了进位,补码自然而然就出来了。
舍弃进位,这不过就是小学的知识点。
但是,计算机专家,却弄不明白这个。
于是,就编造了一套“理论”:
--机器数真值原码反码取反加一符号位不变、符号位也参加运算...
谁要是跟老外学算术,立刻、马上,直接就掉沟里去了!