我们知道,不管是数字还是字符,在计算机中,都是以二进制编码进行表示、存储和处理的。
既然这样,那么为什么有时候我们又听到说 字符数据是以ASCII码、数值是以补码、原码、反码等形式存储的?那么情况是这样的, 在计算机中存储和处理的的确都是些二进制数据,只是说 这些二进制数据 是 以上的 那些信息表示形式 的一种映射。比如 字符 ‘A’,那么计算机在内部存储的就是 它对应的ASCII码 的整数值(65)的二进制形式(0100-0001),相当于把字符A对应到数值65(当然这个对应的规则就是ANSI制定的了),然后计算机存储字符A的时候,就会把他当作 数值65来进行存储,于是 ,计算机存储的便是 数值65的二进制形式0100-0001了
数据大体就分为数值和字符,那么下面就分别介绍一下这两种数据的存储形式
1.计算机中,数的存储
在计算机中,数也分为 有符号数和无符号数两种。在数学中,用正负号来区别 正负数, 但计算机只认识0和1 不认识 -+号,所以计算机便用数的二进制位的最高位来判断此数值是正还是负。计算机规定0为正,1为负。 比如,在一个8位字长的机器内,65被表示为01000001。
(1)原码:
用原码表示数时,最高位为符号位,也就是说剩下的7位用于表示数值。那么这里就涉及到一个范围了,
当此数为负数时,最高位为1,那么剩下的7位数据最大可为 1111111,转换成十进制就是 -127, 同理,此数为正数时,最大可为0 1111111,也就是 127,所以,这里范围便为[-127,127] 即 -(2^7 -1)~2^7-1,这里引出一个公式:
对于一个n位的二进制数,其原码表示范围为 -(2^(n-1) -1)~(2^(n-1) -1).
用原码表示时,对于-0和+0的编码不一样。假设机器字长为8位,-0的编码为10000000,+0的编码为 00000000
反码:用反码表示数时,最高位依然为符号位,正数用0表示,负数用1表示。
正数的反码与原码相同,而负数的反码则在 原码(负数的原码)的基础上符号位不变(为1),其他位取反得到。
反码的表示范围与原码相同-(2^(n-1)-1)~+(2^(n-1)-1)
-0的反码 1 111 1111 +0的反码 0000 0000
补码:和原码 、反码一样,补码也是最高位为 符号位,0为正,1为负,正数的补码与原码相同。 负数在其原码的基础上,符号位不变,其余位取反,再+1。
对于一个负数x的补码,可以用公式 2^n -|x| 得到,其中n为计算机字长。
由于[+67]原=01000011B
[-25]原=10011001B
所以
[+67]补=01000011B
[-25]补=11100110+1=11100111B
那么根据 2^n-|x|公式也能得出 [-25]补=2^8-25=256-25=231
231=11100111B
这里还有一个求补运算能方便地计算一个数的补码形式:
对于一个二进制数,其符号位不变其他位取反+1得到其补码形式
比如[-25]原=10011001
[-25]补=1 1100110+1=1 1100111
补码的表示范围为 -(2^(n-1))~+(2^(n-1)-1) 也就是说,对于字长为8位的CPU,其补码表示范围为 -128~127,但为什么原码和反码最小是-127,补码却是-128呢?
这是因为 "0" 的问题,在补码中,+0和-0实现了统一,都为00000000B表示,并且规定 10000000B为-128的补码,所以 其表示范围就成了 -128~+127
BCD码(Binary-Coded-Decimal 十进制编码) 分为 分为压缩BCD码和非压缩BCD码。
压缩BCD码又称为8421码,它用 4位二进制 来表示一位十进制符号。
比如123的压缩BCD码形式为 0001 0010 0011
非压缩BCD是用8位二进制表示一位十进制符号,其中,每八位中的第四位二进制码和压缩BCD相同,高四位任取。
如123 可用非压缩BCD表示为 0011 0001 0011 0010 0011 0011
我们熟知的ASCII码便是非压缩BCD码的表示方式。