其实学习C语言的时候有一件很头疼的事就是各种各样的数据类型,不同的场合不同的用途不同的数据要使用不同的数据类型,那又为什么要分出这么多种类型呢,因为类型决定了开辟空间的大小,开辟空间的大小又决定了存储的范围。今天,就数据类型这个问题我们来掰扯掰扯。
C语言的内置数据类型大体上可以分为两类,整形家族与浮点数家族。
1. 整形家族 1.1 字符类型 char为什么要把一个装字符的数据类型归到整形家族中呢,因为在C语言的编码集是ASCII码,char类型存储字符是存储字符的ASCII值,在本质上来讲也是存储数字,所以char也属于整形家族的一员。
定义:存放字符的数据类型
大小:1字节
分类:
char signed char unsigned charchar与signed char不一定一样,具体char缺省代表的是有符号还是无符号,由编译器决定。
1.2 短整型 short大小:2字节
1.3 整型 int大小:4字节
2.4长整形 long大小:4/8字节
long类型在内存中占几个字节与所使用的机器有关,在32位的机器上,long在内存中占4字节,而64位机器上,long占8字节。
2.5 long long 大小:4/8字节
C语言规定中没有明确long long 的具体长度,只是定义 long long的长度大于等于long即可,具体由编译器决定。
整形家族在内存中是以二进制补码的形式存储的,而浮点型却是大相径庭的。
根据国际标准IEEE(电⽓和电⼦⼯程协会) 754,任意⼀个⼆进制浮点数V可以表示成下⾯的
形式:
(-1)S * M * 2E(-1)
s表示符号位,当s=0, V为正数;当s=1, V为负数。M表示有效数字,⼤于等于1,⼩于2。
2E表示指数位。
举例:
⼗进制的5.0,写成⼆进制是 101.0 ,相当于 1.01×2^2。
那么,按照上⾯V的格式,可以得出s=0, M=1.01, E=2。
⼗进制的-5.0,写成⼆进制是 -101.0 ,相当于 -1.01×2^2。
那么, s=1, M=1.01, E=2。
2.1 单精度浮点型 float大小:4字节
IEEE 754规定: 对于32位的浮点数,最⾼的1位是符号位s,接着的8位是指数E,剩下的23
位为有效数字M。
大小:8字节
对于64位的浮点数,最⾼的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M。
long double
大小与long long 一样,长度比long长即可,具体由编译器决定
虽然C语言给我们提供了这么多的内置类型,但是在实际工程中,单单这些内置类型是远远不够的,所以又有了构造类型这一概念。
3. 构造类型我们把构造类型分为如下几种
数组类型 结构体类型 struct 枚举类型 enum 联合(共用体)类型 union //成员共用一片存储空间,同一时间只能使用其中一个成员 union Un { char c; int i; }; int main() { union Un u; printf("%dn",sizeof(u)); //4 return 0; }