目录
目录
写给读者的话:
为什么要研究机器内部的数据表示?其中的一个原因或者说目的就是要方便硬件对数据的识别和处理。
那么机器内部的数据如何来表示呢?主要考虑以下几个维度: ①机器所需要支持的数据类型有哪些?(这个和机器研究时候的应用的定位有关) ②机器内部需要表示的数据的范围是多大(这个也和机器研究时候的应用定位有关) ③机器能够表示的数据的精确度 ④数据在机器中的存储和处理的代价(是否有利于运算器设计的优化和简化) ⑤是否有利于软件的移植...
就像各位小伙伴在学习C语言的时候,数据类型不也是分为整型、浮点型和字符型吗,有时候数据的输出也会碰到范围和精度的问题,还有其中的指针不也是与存储相关吗,对吧。
为何要引入原码、反码和补码?因为计算机用机器数进行运算的时候,会产生错误的结果。
一、机器数及其真值
1、真值
为啥要先讲真值这个概念呢?那还用说,因为方便等会引出机器数的概念啊!
何为真值?
就是用二进制表示的数它的正负号就直接用“+” 、“﹣”号来表示。
例如:(-44)10,它的真值就是(-00101100)2
注:其中斜体的10和2分别表示这是十进制数和这是二进制数,下文通通默认斜体的阿拉伯数字皆代表几进制。
2、机器数
还记得刚才讲的真值吗?
机器数就是把正负号数字化,即正号用“0”来表示,负号用“1”来表示。
计算机中机器数的结构
(假定字长为8。字长就是机器中的CPU进行一次整数运算所能够处理的二进制数据的位数,例如,现在的所说的64位就是表示该机器的处理器(CPU)进行一次整数运算所能够处理的二进制数的位数为64。注:下文皆默认字长为8):
还记得(-44)10吗,它的真值就是(-00101100)2 ,机器数为10101100
二、原码、反码、补码、移码
1、原码
原码和机器数就长一样的,十进制数X的 原码记为[X]原。
例如:
[+1]原 = 00000001 [-1]原 = 10000001
[+65]原 = 01000001 [-65]原 = 11000001
0的原码有2个: [+0]原 = 00000000 [-0]原 = 10000000
2、反码
反码是为了求补码而设计的一种过渡编码。十进制数X的反码记作[X]反。
反码的编码规则:
①正数的反码等于原码
②负数的反码是在原码的基础上,符号位不变,其余各位按位取反,即0变1、1变0。
注:苯宝宝的小口诀:正取原,负取反,符不变。
例如:
[+1]反 = 00000001 [-1]反 = 10000001
[+65]反 = 01000001 [-65]反 = 10111110
0的反码有2个: [+0]反 = 00000000 [-0]反 = 11111111
3、补码
十进制数X的补码记作[X]补
补码的编码规则:
①正数的补码与原码、反码一致
②负数的补码是将其反码的末位加1。
注:苯宝宝的小口诀:正取原,负加一。
例如:
[+1]补 = 00000001 [-1]补 = 11111111
[+65]补 = 01000001 [-65]补 = 10111111
0的反码只有1个: [+0]补 = [-0]补 = 00000000
4、移码
定义:除了常用的原码、反码、补码之外,还有一种码制叫做移码。所谓移码,就是在真值 X 上增加一个偏移量来定义的,通常用来表示浮点数的阶码。
表示形式:其表示形式类似于补码,只是其符号位用 1 来表示正数,0 来表示负数,则数值表示部分则是与补码相同。
注:移码是个很偏的知识点了,了解一下就可以了。
三、补码的运算
①符号位也如同数值一样参与运算(注;注意数值的溢出)
②减法运算可转换为加法运算([x + y]补 = [x]补 + [y]补, [x - y]补 = [x]补 + [-y]补)
例如: