导读:计算机系统帮助我们解决现实生活中的实际问题,而现实生活中的实际问题可以抽象为一些未经过处理的数据,这些数据在计算机里是怎样表示的?又有哪些表示方式呢?原来计算机有自己的一套编码机制:原码、反码、补码、移码。
为什么计算机要有码制:在现实生活中的问题数据,基本都是十进制,而作为计算机是无法理解十进制的,计算机的编码都是由0和1组成,所以我们要将我们的问题通过0和1进行描述。而数值从大范围来讲,可以简单分为两个部分:正数、负数、0。在计算机里面,用一个数的最高位存放符号(0为正,1为负),这就是原码的产生!
一、原码
1.1,概念
原码(true form):是一种计算机中对数字的二进制定点表示方法。原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小。
1.2,例子
前提:字长=8
原则:最高位表示正负,其余位表示数值
步骤:1,将欲要表达的数,用二进制表达出来;2,在最高位标识符号;3,缺位用0填补
实例:[+8]原=0 0001000 [-8]原=1 0001000
备注:0既不属于正数,也不属于负数。所以,0的表示方法有两种:[0]原=1 0000000, [0]原=0 00000000
有了原码,将数值进行编码后,就可以对数值进行运算,但是作为原码运算具有一定的缺陷性,比如:[+8]原+ [-8]原=1 0010000,这时候,为了解决这一问题,出现了反码。
二、反码
2.1,概念
反码:是计算机中表示二进制数的一种方法,若原码的符号位不变,对其余位逐位取反,即得到其反码。
2.2,例子
前提:字长=8
原则:最高位是符号位,正数反码=正数原码,负数反码=绝对值按位取反。
实例:[+8]反=0 0001000 [-8]反=1 1110111
经过反码对原码的优化,我们解决了数值运算的问题,但是作为反码运算,又出现了一个新的问题,比如:[+8]反+ [-8]反=[0 0001000]反+[1 1110111]反=[11111111]反=[10000000]原=-0。0既不为正数,也不为负数,所以0带任何符号都是没有意义的,为了解决这一问题,出现了补码。
三、补码
3.1,概念
补码(2's complement):是一种用二进制表示有号数的方法,也是一种将数字的正负号变号的方式,常在计算机科学中使用。
3.2,例子
前提:字长=8
原则:最高位是符号位,正数补码=正数反码=正数原码,负数补码=负数反码+1
实例:1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]补 + [1111 1111]补 = [0000 0000]补=[0000 0000]原
用补码表示阶码的时候,当阶码无限小,产生了下溢的时候,阶码变成了0,那么这个浮点数的值变为了1。而实际上这个数是无限接近于零的。那么我们就需要取出其中的 "-0“ 值作为机器零,于是移码产生了。
四、移码
4.1,概念
移码(又叫增码):是符号位取反的补码,一般用做浮点数的阶码,引入的目的是为了保证浮点数的机器码为全0。
4.2,例子
前提:字长=8
原则:在偏移2的n减一次方的情况下,移码的获得,只需要将补码的符号位取反即可。
实例:[0]补=[00000000] ——>[0]移=[1 0000000]
五、总结
这次是将码制进行了一个整理总结,但是作为小数的码制,这一块还很模糊,需要进一步的学习,也希望有明白小数是怎么转换的人,对我多多指导!