目录
一、预备知识
1、原码、反码与补码
有符号数的有三种表示方法,即:原码、反码、补码;这三种表示方法均有符号位与数值位,最高位的那一位就是符号位,用0表示正数,1表示负数。正数的原、反、补码都相同
原码:直接将二进制按正负数的形式翻译成二进制就可以。
补码:将原码的符号位不变,其他位依次按位取反就可以了。
补码:反码+1就是补码
2、大小端介绍
大端模式:数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中。
小端模式:数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地址中。
打比方:给一个数20,它的16进制是:00 00 00 14,其中14处于低位。
在小端模式上,它是这样存储的:
在大端模式上,它是这样存储的:
二、整数在数据中的存储
结论:整数是以补码的方式存储在内存中的。
例如:int a=20,它的原、反、补码相同。
则它的补码是:00000000 00000000 00000000 00010100
补码化为16进制:00 00 00 14
int b=-10
它的原码是:10000000 00000000 00000000 00001010
它的反码是:1111111 11111111 11111111 11110101
它的补码是:1111111 1111111 11111111 11110110
补码化为16进制:ff ff ff f6
下面我们从编译器看看数据是否是以补码的方式存储在数据中
有上图可以看出,数据是以补码的方式存储的,并且是小端方式。读者可以用更多的例子去验证,我就不在举例了。
三、浮点数的存储
IEEE 754规定(规定浮点数存储的准则):
1、32位的浮点数,最高的1位是符号位s,接着的8位是指数位E,剩下的23位为有效位数字M。对于64位的浮点数,最高的1位是符号位s,接着的11位是指数位E,剩下的52位为有效位数字M。
2、计算机 计算机在保存M时,默认这个数的第一位总是1,因此可以被舍弃,只保存。如保存1.01的时候,只保存01.到读取的时候,再把第一位的1加上去。这样做的原因是为了存储更大的数。以32位浮点数为列,留给M只有23位,将第一位的1舍弃,等于可以保存24位有效数字。
3、规定E是一个无符号整数,但是我们知道,科学计数法中E可以是负数的。所以IEE754规定,存入内存时E的真实值必须加上一个中间数,对于8位的E加上127;对于11位的11,加上1024。比如2^10的E是10,所以保存32位浮点数是,必须保存成10+127=137,即10001001.
下面我们做几个题,来理解这些意思。
1、十进制的浮点数:-5.0
首先我们得先化成二进制,则-101.0,科学计数法:-1.01x2^2,则s=1,M=1.01,E=2
我们把E+127=129,化成二进制,则是1000 0001,M=1.01,在内存中,我们舍弃第一个1,只保存01
所以-5.0在内存中的存储是这样的1 10000001 01000000000000000000000
第一位’1‘是符号位,接下来的8位’10000001‘是指数位,剩下的23位’01000000000000000000000‘
是有效位。
2、十进制数字0.5
首先我们得先化成二进制,则0.1,科学计数法:1.0x2^-1,则s=0,M=1.0,E=-1
我们把E+127=126,化成二进制,则是011111110,M=1.0,在内存中,我们舍弃第一个1,只保存0
所以0.5在内存中的存储是这样的0 011111110 00000000000000000000000
第一位’0‘是符号位,接下来的8位’011111110‘是指数位,剩下的23位’0000000000000000000000‘
是有效位。
下面我们将二进制的浮点数化为十进制
浮点数:1 10000001 01000000000000000000000
由第一位我们知道,这是个负数,接下来的8位10000001,化为十进制129,129-127=2,则指数的数值是2,再通过接下来的23位01000000000000000000000,我们得出M=1.01,所以这个数二进制数是-1.01x2^2,即-101.0
再化成十进制,即-5.0.