计算机中的二进制补码是如何表示正负数的补码的?
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。
如果你忽略了进位,这两种算法的功能,就是完全相同的。
+99 本来是正数,却成了负数“-1”!
而且,加法,也就完成了减法运算。
原因:舍弃进位,就是减去 100。再加 99,自然就是-1。
舍弃进位后,就把并没有符号的数,变成了负数!
同理,在计算机中舍弃进位:
● 正数(即所谓的“补码”)就能当负数使用;
● 加法,也就代替了减法运算!
因此,只需给计算机配置一个加法器,便可横行天下!
重要问题说三遍:
* 补码的来历,是【舍弃进位】!!! *
* 补码的来历,是【舍弃进位】!!! *
* 补码的来历,是【舍弃进位】!!! *
---------------------
计算机,使用的是二进制数。
八位机使用八位数:0000 0000 ~ 1111 1111。
就相当于十进制数:0 ~ 255。
如果出现进位就是:2^8 = 256。
在这种环境中,就要用 255 (1111 1111) 当-1 了。
254 (1111 1110),就是-2 了。
。。。 。。。
128 (1000 0000),就是-128 !
以上这 128 个正数(128 ~ 255)就能代表负数(-128 ~ -1)进行计算。
以上这些正数,就是计算机专家所发明的“负数的补码”。
计算机专业教材上有这个补码定义式:[ X ]补 = 2^n + X。
(补码,和符号位原码反码取反加一,神马关系都没有!)
.
那么,127 (0111 1111),能不能当负数?
不能!
它的最高位是 0,相加后,产生不了进位 1 !
即使舍弃进位 0,它也不能呈现出负数的特点!
所以,0 ~ 127,都不能代表负数,只能代表它们自己。
因此,计算机专家就总结出来了:零和正数的补码,就是它们自己!
这句话,怎么有点别扭。。。
---------------------
那么,“补码的最高位 1,就是一个负数”的原因,如下。
* 能产生进位的补码,才是负数 !!! *
看懂了吗? 最高位,并非是人为定义的符号位!
如果它真的是正负号(+、-),又怎么能参加计算呢?
而且,+99,也没有符号位啊,它怎么能当负数使用呢?
由此可知,符号位的说法,站不住脚。
由此可知,原码和反码,也都是胡乱的定义。
---------------------
其实,所谓的“补码”,它也是正常的二进制数,它本来就是没有符号的数字。
虽然,它们是一组数据中较大的一半,
但是,它们仍然是“数”,不是“神马码”。
因此,利用“补码”当做正负数做加减计算,与“无符号数”的加法,算法是完全相同的!
那么,“有符号数(补码)”、“无符号数”,就可以【共用同一个加法器】!
这就实现了“两种类型数据”的统一、“两种算法(加减)”的统一。
原码和反码,都没有这些功能。
所以,计算机中,根据不存在原码和反码。
“机器数原码反码补码正数三码相同负数取反加一符号位不变模符号位也参加运算时针倒拨正拨...”
这些都是垃圾!
你就是把它们都背熟了,也是啥用都没有的。
当然,你将来如果当上了计算机老师,你还可以拿这些去忽悠下一代学生。