目录
前言
在介绍数据在内存种存储之前先给大家讲一些小的知识点为下面做铺垫。首先是栈空间的使用习惯是先使用高地址再使用低地址,我下面讲的都是以小段形式存储,在vs的realease版本下对代码进行优化但是无法调试。数据类型的意义就是使用这个数据类型开辟内存空间大小。
数据类型
char,short,int,long,long long,double,float
char类型不确定它有无符号,由编译器决定,在内存中以ascii的形式存储。取值范围是-128-127.
short,int,long都是存储其补码。
short取值范围:-32767 ~ + 32768
int取值范围:-2147483648 ~ +2147483647
long取值范围:-2147483648 ~ +2147483647
long long:-9223372036854775808 ~ +9223372036854775807
double,float浮点型在内存中以(-1)^S*M*2^E的形式存储。
逐个击破:
1.内置类型:
char:
字符型在内存中以ascii码的形式以十六进制形式存储。
a的ascii码值是97,十六进制是61,占一个字节,因为a在这里是局部变量存在栈区所以存储的是61.
short:
短整型占两个字节,在内存中存储其补码。分正负。
s为15反码为00000000 00001111对应十六进制为00 0f小端存储为0f 00。
s为-15补码为11111111 11110001对应十六进制为ff f1小端存储为f1 ff.
int:
int占四个字节,在内存中也是存储其补码,分正负。
i值为20对应补码为00000000 00000000 00000000 00010100对应十六进制为00 00 00 14,小端存储为14 00 00 00.
i值为20对应补码为11111111 11111111 11111111 11101100对应十六进制为ff ff ff ec,小端存储为ec ff ff ff.
long:
long在32位机器占四个字节64位机器占8个字节,也是存补码,分正负。以32位为例。
跟int一样参考int.
以64位为例
long long:
占八个字节,存储其补码,分正负。
float:
flout占四字节,在内存中存储与整型和字符型不同,以(-1)^S*M*2^E的形式存储。(-1)^S表示符号位占一比特,M表示有效数字大于1小于2占23比特,2^E表示指数占8比特。以5.5为例,二进制可写成101.1也就是1.011*2^2此时S为0,E为2存储时要加127变为129,M为1.0111.可写成0 10000001 0110000000000000000000十六进制为40 b0 00 00,小端存储为00 00 b0 40.下面验证一下。
double:
占八个字节,以(-1)^S*M*2^E的形式存储。(-1)^S表示符号位占一比特,M表示有效数字大于1小于2占52比特,2^E表示指数占11比特。存储时E要加上1023.
但是从内存中取出一个浮点型数怎么取呢?
分三种情况:
E不全为0或不全为1
这个就是正常情况,取出内存中的数时,指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位的1。
E全为0
这时,浮点数的指数E等于1-127(或1-1023)即为真实值,有效数字M不再加上第一位的1,而是还原为0.xxxxxxx的小数。这样做是为了表示正负零,以及接近于0的很小的数字。
E全为1
这时,有效数字M全为0,表示正负无穷大。
举个列子9.0在内存中存储形式为0 10000010 00100000000000000000000对应十六进制为41 10 00 00,对应小端为00 00 10 41.
以整型打印的话为
总结:
对于整型和字符型我们比较好理解,但是对于字符型由于存储形式特殊,需要计算不好理解,还是要多敲代码多调试。