我们都知道在计算机内部数据的存储和运算都采用二进制,这是因为计算机是由很多晶体管组成,而晶体管只有两种状态,恰好可以用二进制的0和1表示,并且采用二进制可以使得计算机内部的运算规则简单,稳定性高。
在计算机有整数和实数,而两者在计算机中以二进制存储的规则又是大不相同的。
整数
计算机中将整数又分为无符号整数(unsigned)和有符号整数(signed)。
对于无符号整数而言,它的原码,反码,补码都是相同的,直接采用其二进制形式表示即可。
对与有符号整数而言,规定取最高位作为其符号位,若最高位为0表示正数,否则为负数,它的原码,反码,补码之间的关系是:反码等于原码除符号位全部取反;补码等于反码+1。
计算机中整数是以补码形式进行存储的
原因有下:
- 能够统一 +0 和 -0 的表示
- 对于有符号整数的运算能够把符号位同数值位为一起处理
- 能够简化运算规则
只有用补码表示,+0和-0的表示形式才一致。正因为如此,所以补码的表示范围比原码和反码表示的范围都要大,比如8byte用补码能够表示的范围为-128127,0127分别用0000000001111111来表示,而-127-1则用1000000111111111来表示,多出的10000000则用来表示-128。因此对于任何一个n位的二进制,假若表示带符号的整数,其表示范围为-2^(n-1)2^(n-1)-1。
实数
目前所有c编译器都采用IEEE所制定的标准浮点格式,即二进制科学表示法存储实数。
二进制科学表示法的公式为:S=M*2^N ,主要由三部分构成:符号位+阶码(N)+尾数(M)。对于float型数据,其二进制有32位,其中符号位1位,阶码8位,尾数23位;对于double型数据,其二进制为64位,符号位1位,阶码11位,尾数52位。
下面举例说明:
float型数据125.5转换为标准浮点格式
125二进制表示形式为1111101,小数部分表示为二进制为 1,则125.5二进制表示为1111101.1,由于规定尾数的整数部分恒为1,则表示为1.1111011*2^6,阶码为6,加上127为133,则表示为10000101,而对于尾数将整数部分1去掉,为1111011,在其后面补0使其位数达到23位,则为11110110000000000000000
则其二进制表示形式为
0 10000101 11110110000000000000000
double类型也是使用相同的方法转换。