由于计算机的限制,无论是整数还是浮点数,其在内存中的存储大多通过二进制进行。
一、整数的二进制存储
1、位的划分
有符号整数的二进制序列中最高位为符号位,其余位为数值位,符号位用1表示负,0表示正。
2、正负整数的存储(原码、反码、补码)
无论是正是负,内存存放的都为补码。
正数原码、反码、补码都一致。
负数转换为补码的规则:
原码:直接按照正负数转换为二进制所得到的就是原码;
反码:原码符号位不变,数值位取反得到反码;
补码:反码+1得到补码;
3、无符号整数
无符号整数没有符号位,均为数值位。
二、浮点数的二进制存储
1、位的划分
根据国际标准IEEE754,任意一个二进制浮点数V可表示为以下形式:
V=(-1)^S * M * 2^E
>> (-1)^S表示符号位,S=0,V为正数;S=1,V为负数;
>> M表示有效数字,且1<M<2;
>> 2^E表示指数位
如5.0的二进制为101.0,相当于1.01*2^2,S=0,M=1.01,E=2;
-5.0二进制为-101.0,则S=1,M=1.01,E=2;(二进制小数点后n位表示2^-n,如0.001表示1/8)
对于32位的浮点数(float),最高一位存储符号位,8位存储指数E,剩下的23位存储M;
对于64位的浮点数(double),最高一位存储符号位,11位存储指数E,剩下的53位存储M;
2、浮点数存储过程
对于M来说,由于M必定大于1且小于2,故M的第一位必为1,在存储时为节约空间,只保留小数点后部分,如1.01只保留01,等到读取时自动补上1。
对于E来说,其可以为负数,根据IEEE 754规定,存入内存的E的真实值需加上一个中间数,对于8位的E,中间值为127,对于11为的E,中间值为1023。如2^10的E为10,保存时则为10+12=137,即1000 1001。