java 位域_C 位域

补充楼上 @karma,位域的内存大小测试

// 位域内存测试

#include

struct ONE_BYTE

{

unsigned char _bool : 1;

unsigned char del_flag : 1;

unsigned char status : 4;

} one_byte;

struct TWO_BYTE

{

unsigned char ccc1 : 4;

unsigned char ccc2 : 4;

unsigned char ccc3 : 4;

unsigned char ccc4 : 4;

} two_byte;

struct THREE_BYTE

{

unsigned char ccc1 : 4;

unsigned char ccc2 : 4;

unsigned char ccc3 : 4;

unsigned char ccc4 : 4;

unsigned char ccc5 : 4;

} three_byte;

struct FOUR_BYTE

{

unsigned int ccc1 : 16;

unsigned int ccc2 : 16;

} four_byte;

struct EIGHT_BYTE

{

unsigned char ccc1 : 1;

unsigned int ccc2 : 1;

} eight_byte;

int main(int argc, char const *argv[])

{

printf("sizeof one_byte is : %lu\n", sizeof(one_byte));

printf("sizeof two_byte is : %lu\n", sizeof(two_byte));

printf("sizeof three_byte is : %lu\n", sizeof(three_byte));

printf("sizeof four_byte is : %lu\n", sizeof(four_byte));

printf("sizeof eight_byte is : %lu\n", sizeof(eight_byte));

return 0;

}

输出结果为:sizeof one_byte is : 1B

sizeof two_byte is : 2B

sizeof three_byte is : 3B

sizeof four_byte is : 4B

sizeof eight_byte is : 4B

由输出,可以验证以下结论:

(1)结构体内存分配原则:

原则一:结构体中元素按照定义顺序存放到内存中,但并不是紧密排列。从结构体存储的首地址开始 ,每一个元素存入内存中时,它都会认为内存是以自己的宽度来划分空间的,因此元素存放的位置一定会在自己大小的整数倍上开始。

原则二: 在原则一的基础上,检查计算出的存储单元是否为所有元素中最宽的元素长度的整数倍。若是,则结束;否则,将其补齐为它的整数倍。

(2)定义位域时,各个成员的类型最好保持一致,比如都用char,或都用int,不要混合使用,这样才能达到节省内存空间的目的。

xkl

xkl

923***865@qq.com2年前 (2019-04-09)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值