1. 数据在内存中的存储方式
数据在内存中的存储按照存储的顺序不同分为大端存储和小端存储。当字节的大小超过1字节的时候,就会有存储顺序的区别。如short 类型的2表示为00000000 00000010存储的时候,可以把全0位放在第一个位置,也可以放在第二个位置,这便是存储顺序。下面分别讲一下大端和小端。
1.1 大端存储
将数据的低字节内容放在内存的高地址处,将数据的高字节内容放在内存的低地址处。
1.2 小端存储
将数据的低字节内容放在内存的低地址处,将数据的高字节内容放在内存的高地址处。
1.3 判断当前机器的字节序
思路:当int 1 的00000001字节放在了内存的高地址处,将其取地址后强制类型转换为char * 类型,再解引用,判断是否为1,为1则是小端,为0则是大端。
2. 整数在内存中的存储
整数在内存中存的是他的补码。这里再介绍一下计算机的源码,反码,补码。
2.1 源码,反码,补码
数据 : int a = 4;
源码:最高位为符号位,为0则是正数,为1则是负数
源码:00000000 00000000 00000000 000000100
反码:源码除了符号位,所有位取反
反码:01111111 11111111 11111111 11111011
补码:反码+1
补码:01111111 11111111 11111111 11111100
补码便是整型4在内存中的存储了。
3. 浮点数(float,double,long double等)在内存中的存储
3.1 浮点数的二进制表示
浮点数的整数部分表示为二进制跟整数是一样的,不同的是小数部分。
例如:十进制:1.5
二进制:1.1
这里的小数部分,小数点后第一位是表示2的-1次方,即0.5.第二位便是2的-2次方。以此类推
3.2 浮点数的存储
根据国际规定,所有的浮点数在内存中存储的是关于S,M,E的数据
公式的第二部分和第三部分需要调整为与科学计数法类似的表示方法。第三部分对应科学计数法中2的多少次方。第二部分则是需要在1到2之间。
例如:十进制:1.5
二进制:1.1
则对应的S =0,M=1.1 ,E =0;
注意:对于E,为了避免无符号整数E,它的范围是0-255,然而科学计数法中E可能是负数,为了避免E存负数,需要加一个中间数。 对于float 类型的浮点数,这个中间数是127。对于double类型 的浮点数,这个中间数是1023。即对于上面的例子来说,E = 0+127 = 127。