请教内存对齐的问题

kangzuo 2006-02-25 04:06:24
有个问题不明白
struct stru{
int a:3;
short b:3;
int c:20;
int d;

};
sizeof(stru)=16;

struct stru{
int a:3;
int b:3; //或改为long b:3;或unsigned b:3;结果一样
int c:20;
int d;

};
sizeof(stru)=8;
...全文
172 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
megaboy 2006-03-08
  • 打赏
  • 举报
回复
int b:3; //或改为long b:3;或unsigned b:3;结果一样
----------------------------------------------
位字段的类型是implementation-defined的,不仅类型如此,甚至最高位是否为符号位也是implementation-defined的,在C99里,位字段的类型甚至还可以是Bool类型。不同的编译器可能会有不同的结果,在你使用的编译器里面,可能long b:3或unsigned b:3的结果一样,但其它编译器不一定的,也可能是不一样的。

位字段应该少用为妙。
bohlee 2006-03-08
  • 打赏
  • 举报
回复
楼上整解
021850524 2006-02-26
  • 打赏
  • 举报
回复
第一个:
int a:3//1 byte
short b:3//因类型不同, 从下一个4字节处开始, 1byte
int c:20//因与上面类型不同, 从下一个4字节处开始, 3byte
int d;//类型相同, 但是不是位域, 也从下一个4字节开始
所以是16.
相当于:
int a:3;
int :29;

short b:3;
short :29;

int c:20;
int :12;

int d;
共16字节.
第二个分析同样.
xiaocai0001 2006-02-25
  • 打赏
  • 举报
回复
这是结构体位域的问题

>> int b:3; //或改为long b:3;或unsigned b:3;结果一样
这个位域定义与long int没有多大关系

标准的写法应该用unsigned型

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧