C语言 常用类型 字节数大小
基本类型
有符号 | 无符号 | 32位 | 64位 |
---|---|---|---|
[signed] char | unsigned char | 1 | 1 |
short | unsigned short | 2 | 2 |
int | unsigned int | 4 | 4 |
long | unsigned long | 4 | 8 |
long long | unsigned long long | 8 | 8 |
int32_t | uint32_t | 4 | 4 |
int64_t | uint64_t | 8 | 8 |
void* | 4 | 8 | |
float | 4 | 4 | |
double | 8 | 8 |
其他都是一样的,主要区别在long
与void*
,32位系统和64位系统存在差异。
其他类型
数组和字符串
int array[] 字节数 = 基本类型的字节数 × 数组个数
char str[] 字节数 = char
类型的字节数(即1个字节) × 字符个数 + 1(\0
)
字符串类型计算字节数时需要加上末尾不显示的\0
。
结构体与联合体
联合体(union)
union的长度由最大长度的成员与类型长度最大的成员共同决定,其长度是类型长度最大的成员长度的整数倍。
union G
{
char name[30];
double al;
char sex;
int age;
float height;
};
联合体G需要占用空间最大的是元素char name[30]
,为30个字节,但是类型中占用空间最大的是double类型,为8个字节。所以联合体G需要是既是double类型的整数倍,也要大于等于30,因此sizeof(G)=32。
结构体(struct)
字节对齐的细节和具体编译器实现相关,但一般而言,满足三个准则:
- 结构体变量的首地址能够被其长度最大基本类型成员的大小所整除;
- 结构体每个成员相对于结构体首地址的偏移量都是当前成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;
- 结构体的总大小为结构体长度最大基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。
typedef union {
long i;
int k[5];
char c;
} DATE;
struct data {
int cat;
DATE cow;
double dog;
} ;
以32位系统为例,首先,联合体union中,最大的元素是int[5]
占用5×4=20个字节。联合体中类型长度最大的成员大小为4个字节,20字节符合类型长度最大的成员的整数倍,因此,union的大小为20个字节。
结构体中,长度最大的基本类型成员为double
类型,因此需要按8字节进行对齐。int cat
加上DATE cow
的字节数正好是24,不用进行补位对齐,所以,结构体的大小为32字节。