![](https://i-blog.csdnimg.cn/blog_migrate/c589b51c08784fcfe8ae6c4fbe715359.png)
1.数据的类型
整型类型
char
signed char
unsigned char
short
unsigned short [int]
signed short [int]
int
signed int
unsigned int
long
signed long [int]
unsigned long [int]
long long
signed long long [int]
unsigned long long [int]
[ ]表示可以省略
浮点数类型
float
double
构造类型
数组类型
结构体类型
枚举类型
联合类型
指针类型
int*
float*
char*
void*
空类型
void
常用于函数返回类型、函数参数、指针类型
2.数据的存储
大小端字节序存储模式(小同大异)
什么是大端小端
大端存储:数据的低位储存在内存的高地址中,数据的高位储存在内存的低地址中
小端存储:数据的低位储存在内存的低地址中,数据的高位储存在内存的高地址中
为什么要有大小端
在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8 bit。但是在C语言中除了8 bit的char之外,还有16 bit的short型,32 bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。
例如:int a = 0x11223344
小端存储:11是高位,存储在高地址,44是低位,存储在低地址;大端存储相反。
如何判断大小端
可以编写程序测试:
#include<stdio.h>
int main()
{
int a = 1;
//a = 0x 00 00 00 01
if (*(char*)&a == 1)
printf("小端\n");
else
printf("大端\n");
return 0;
}
整型在内存中的存储
计算机中整数的表示方法有三种:原码、反码、补码。
整数在内存中都是以补码的形式存储的。
![](https://i-blog.csdnimg.cn/blog_migrate/e28d10bf66195ccb35e09d7017ae8484.png)
![](https://i-blog.csdnimg.cn/blog_migrate/0dcb61b53279b2e44bfa0c648c33de3c.png)
因为这次测试的环境是小端存储,所以顺序不一样。
浮点型在内存中的存储
对于任何一个二进制浮点数都可以写成一种形式:(-1)^S*M*2^E,所以计算机只要将SME存储起来就可以了。
例如:
5(101)可以写成 (-1)^0*1.01*2^2
9(1001)可以写成 (-1)^0*1.001*2^3
那么在计算机中是如何存储的呢?
对于32位的浮点数,最高的1位是符号位S,接着的8位是指数E,剩下的23位为有效数字M。
![](https://i-blog.csdnimg.cn/blog_migrate/21a461e10d8650a32adbac140dbc99aa.png)
对于64位的浮点数,最高一位是符号位S,接着的11位是指数E,剩下的23位是有效数字M。
![](https://i-blog.csdnimg.cn/blog_migrate/4191d27b3dfd43eede93d06a1293472f.png)
对于M的规定:
M是一个大于1小于2的数,也就是说可以写成1.xxxxxxxx的形式,1可以省略,所以在存储时M只需要将小数位存起来就可以了。这样一来,32(64)位浮点数可以精确到24(53)位有效数字。
对于E的规定:
E是一个无符号整型数字,但是我们知道指数位可能出现负数,对于32(64)位浮点数,E只能表示0~255(0~2047)之间的数,所以规定,E在存储时要在真实值的基础上加上127(1023)。比如,2^10,E的真实值是10,在存储时+127(+1023)变为137(1033)。
E从内存中取出分三种情况:
1:E不全为0也不全为1
浮点数的E的真实值可以直接减去127(1023)即可得到
2:E为全0
E的真实值为1-127(1-1023),说明这是一个非常小的浮点数,这时M小数点前的1写成0,这样做是为了表示这个数是一个很接近于0的数。
3:E为全1
这时,如果M全为0,就表示+-无穷(+-通过S判断)