Linux C字节
1、单位换算
1字节(Byte)= 8比特位(bit)
例如:Linux C 数据类型int:占4字节(4*8=32位)如果无符号表示最大的数是(232 -1 = 4294967295)
1 KB = 1024(210)B
1 MB = 1024 KB
1 GB = 1024MB
2、Linux C 各数据类型占字节大小
数据类型 | 32位编译 | 64位编译 |
---|---|---|
char | 1 | 1 |
short | 2 | 2 |
int | 4 | 4 |
unsigned int | 4 | 4 |
float | 4 | 4 |
double | 8 | 8 |
long | 4 | 8 |
unsigned long | 4 | 8 |
longlong | 8 | 8 |
*指针 | 4 | 8 |
3、机构体所占的字节数
规则:(1)结构体每一个成员相对于结构体首地址的偏移量是该成员的整数倍;
(2)结构体变量所占空间大小是对其参数的整数倍(通常对齐参数根据32位机和64位机,最大分别为4字节对齐和8字节对齐。对齐参数为结构体中成员数据类型最大的那一个)
综上:每一个成员首地址偏移量必须能整除该元素的长度
整个结构体的长度必须能整除最大成员的字节数
例如:64位编译器
struct Element_ST{
short ele1;
char ele2[15];
char * ele3;
long ele4;
int ele5;
short ele6;
char ele7;
int ele8;
char ele9;
};
void main()
{
printf("size is %d\n", sizeof(struct Element_ST));
}
分析:
1、64位编译器最大对齐参数是8,结构体中有指针类型、long型所以对齐参数就是8字节
2、开始按照顺序分配内存
short ele1; 2字节
char ele2[15]; 15字节
char * ele3; 指针8字节,根据对齐规则1,所以要重新开始8字节对齐
long ele4; 8字节
int ele5; 4字节
short ele6; 2字节
char ele7; 1字节
int ele8; int 4字节,根据对齐规则1,所以要重新对其4个字
char ele9; 1字节,根据对齐规则2,结构体是对其参数的整数倍,所以后面
3字节也会被占据
综上:7 * 8 =56字节,程序测试结果确实是56
[root@localhost home]# gcc -g -o client ClientM.c
[root@localhost home]# ./client
size is 56
[root@localhost home]#