在深入了解数据在内存中的存储之前,我们首先得做一些前期的准备工作,即了解关于c语言中类型的分类,再在这部分前置知识的基础上了解整型数据和浮点型数据分别是怎么样在内存中存储的。这篇文章主要介绍了数据类型在内存中的分类,重点介绍整型和浮点型。
类型的分类
在c语言中,我们将数据类型分为整型,浮点型,构造类型,指针类型和空类型。一方面,不同的类型意味着使用这个类型时开辟的内存空间的大小不同,而内存空间的大小决定了使用范围;另一方面,不同的类型也决定了我们看待内存空间的视角不同。
整型
整型家族里的成员有char,short,int,long,long long等,它们中的每个又可以分为有符号和无符号两种,具体分类见下:
- char
C标准未规定char是按signed char处理还是按unsigned char处理,这取决于编译器,但大多数编译器规定为signed char。
为什么将char归在整型里?
在内存中,char是以ASCII码的形式存储的,而ASCII码本质上也是一个个整型数字,所以可以认为char也是一种整型数据。
分类 | 范围 | 输出格式 | 大小 |
unsigned char | 0~255 | %c | 1字节 |
signed char | -128~127 |
- short
short 也可以写成short int,但int通常省略不写
C标准规定short按signed short处理。
分类 | 范围 | 输出格式 | 大小 |
unsigned short | 0~65535 | %hu | 2字节 |
signed short | -32768 ~ 32767 | %hd |
- int
C标准规定int 按signed int处理。
分类 | 范围 | 输出格式 | 大小 |
unsigned int | 0~4294967295 | %u | 4字节 |
signed int | -2147483648 ~ 2147483647 | %d |
- long
C标准规定long 按signed long处理。
long 也可以写成long int,但int通常省略不写
分类 | 范围 | 输出格式 | 大小 |
unsigned long | 0~(2^32)-1 | %lu | 4字节 |
signed long | -2^31 ~ (2^31)-1 | %ld |
- long long
C标准规定long long按signed longlong处理。
long long也可以写成long long int,但int通常省略不写
分类 | 范围 | 输出格式 | 大小 |
unsigned long long | 0~(2^64)-1 | %llu | 8字节 |
signed long long | -2^63 ~ (2^63)-1 | %lld |
浮点型
浮点型数据用来表示具有小数点的实数。浮点型家族里的成员有float和double两兄弟。它们同样可以分为有符号和无符号两种,具体分类见下:
分类 | 大小 | 输出格式 | 默认保留位数 | |
float | unsigned float | 4字节 | %f | 6 |
signed float | ||||
double | unsigned double | 8字节 | %lf | |
signed double |
构造类型和指针类型
由于本文的介绍重点为数据在内存中的存储的前置知识,因此对构造类型和指针类型不做着重描述。
构造类型
构造类型分为数组类型,结构体类型 struct,枚举类型 enum和联合类型 union,这里简单介绍一下数组类型,其他不做展开介绍。
- 数组类型
格式: 类型 数组名[数组元素个数]
类型表示数组所存储元素的数据类型,例如int,char等。
起数组名的时候最好起一些有含义的名称,便于他人理解和日后更改等
数组中若指定元素数目,那么[]中只能是整型数据或者是整数表达式,例如[10]、[5+5],一般来说,C语言数组[ ]里不可以放变量,因为他们是使用C99之前的标准(C99标准中规定可以数组[ ]里可以放变量).
为什么数组类型是构造类型?
给定一个数组 int arr[10];它的类型为int[10]而不是int,因此数组类型是构造类型而不是基本数据类型。
指针类型
指针类型有int *,char *,float* ,void* 等。