关于unsigned int a:4,总结一下,还是有一些疑问的,请看...

swcims 2005-10-24 04:59:00
就拿一个帖子
struct table_entry
{
int count ;
char c;
unsigned int f1 :4;
unsigned int f2 :1;
};
到底unsigned int f1:4是多少位呢?在PII 的RH Linux7.2上,unsigned int应该是4个字节的。同理,unsigned f2:1呢?
jpopop() 说,“f1和f2 4bytes”,怎样理解?
snowbirdfly说:一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。
那么,f1是用了4位,然后剩下的位(4个字节减去4位)全补0吗?还是,f1和f2全在一个字节中?
谢谢!
...全文
216 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
gnixemos 2005-10-26
  • 打赏
  • 举报
回复
unsigned int f1 :4; \\该字节的低四位
unsigned int f2 :1; \\该字节的低字节的第5位
该字节是结构的第6个字节

liubo1977 2005-10-25
  • 打赏
  • 举报
回复
我觉得应是:
f2:取第二字节最低三位
f3:取第三字节最低三位,如果不够,去拿最低字节的最低位来补充
swcims 2005-10-25
  • 打赏
  • 举报
回复
谢谢youngdreamer2008,但我不明白为什么要用联合,这样的话,temp.b.f1就是f1所占的字节数吗?这道题的答案是"7,6,5"(PIII,RHLinux7.2)。
怎样分析?盼能再答复,谢谢!
youngdreamer2008 2005-10-25
  • 打赏
  • 举报
回复
联合的作用相当于地址强制转换,可以将int i的赋值按f1,f2,f3这样的位域输出,当然,f1取最低字节的低四位,f2,取最低字节的紧接三位,f3,取最低字节的最高1位加倒数二字节的最低两位合并,运行结果f1=7,f2=6,f3=5了,哈哈,以后多切磋了……
youngdreamer2008 2005-10-24
  • 打赏
  • 举报
回复
#include <stdio.h>
struct bt{
unsigned int f1:4;
unsigned int f2:3;
unsigned int f3:3;
}b;
union un{
int i;
struct bt b;
};

int main(int argc, char* argv[])
{
union un temp;
temp.i=0x2e7;
printf("%d,%d,%d",temp.b.f1,temp.b.f2,temp.b.f3);
return 0;
}

69,371

社区成员

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

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