C语言位字段

loveqise 2016-11-17 09:53:23
1、struct{
unsigned int field1:1;
unsigned int :2;
unsigned int field2:1;
unsigned int :0;
unsigned int field3:3;
};每一个unsigned int都是一个位字段吗?整个struct有32位,还是每一个unsigned int都有32位?
2、位字段有几种形式,只有unsigned int、int、signed int吗?
3、unsigned int位字段最长是32位吗?(目前电脑int是32位)
4、如果声明总位数超过unsigned int 的大小,那将会使用下一个unsigned int 的位置。不允许一个字段跨越两个unsigned int 的边界,编译器自动地以为一个这样的字段定义,使字段按unsigned int 对齐。发生这种情况时,会在第一个unsigned int 中留下一个未命名的洞
这段话的意思是超过32位,比如什么了unsigned int field3:52;,会产生两个位字段,每个26位吗?如果只声明了一个位字段,会自动生成一个位字段吗?
5、使用未命名字段“填充”未命名的洞。使用一个宽度为0的未命名字段迫使下一个字段与下一个整数对齐。未命名的洞是指上述例子中,26位使用后剩下的6位吗。宽度为0的未命名字段迫使下一个字段与下一个整数对齐是指field3是下一个struct对齐吗?








































































...全文
249 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdghchj 2016-11-18
  • 打赏
  • 举报
回复
http://c.biancheng.net/cpp/html/102.html
loveqise 2016-11-18
  • 打赏
  • 举报
回复
引用 3楼ipqtjmqj 的回复:
问题3 :看头文件<limits.h>中的宏UINT_MAX
那剩下几点对不对?
赵4老师 2016-11-18
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
#pragma pack(push,1)
union U {
    unsigned char byte;
    struct BF {
        unsigned int b0:1;//a
        unsigned int b1:1;//b
        unsigned int b2:1;//c
    } bf;
} u;
#pragma pack(pop)
unsigned char bt;
int a,b,c;
int main() {
    for (bt=0;bt<8;bt++) {
        u.byte=(unsigned char)bt;
        a=u.bf.b0;
        b=u.bf.b1;
        c=u.bf.b2;
        printf("byte 0x%02x -- c:%d b:%d a:%d\n",bt,c,b,a);
    }
    for (c=0;c<2;c++)
    for (b=0;b<2;b++)
    for (a=0;a<2;a++) {
        u.bf.b0=a;
        u.bf.b1=b;
        u.bf.b2=c;
        bt=u.byte;
        printf("c:%d b:%d a:%d -- byte 0x%02x\n",c,b,a,bt);
    }
    return 0;
}
//byte 0x00 -- c:0 b:0 a:0
//byte 0x01 -- c:0 b:0 a:1
//byte 0x02 -- c:0 b:1 a:0
//byte 0x03 -- c:0 b:1 a:1
//byte 0x04 -- c:1 b:0 a:0
//byte 0x05 -- c:1 b:0 a:1
//byte 0x06 -- c:1 b:1 a:0
//byte 0x07 -- c:1 b:1 a:1
//c:0 b:0 a:0 -- byte 0x00
//c:0 b:0 a:1 -- byte 0x01
//c:0 b:1 a:0 -- byte 0x02
//c:0 b:1 a:1 -- byte 0x03
//c:1 b:0 a:0 -- byte 0x04
//c:1 b:0 a:1 -- byte 0x05
//c:1 b:1 a:0 -- byte 0x06
//c:1 b:1 a:1 -- byte 0x07

ipqtjmqj 2016-11-17
  • 打赏
  • 举报
回复
问题3 :看头文件<limits.h>中的宏UINT_MAX
ipqtjmqj 2016-11-17
  • 打赏
  • 举报
回复
问题2,所有整数型[signed / unsigned]<char, short, int, long, long long>
ipqtjmqj 2016-11-17
  • 打赏
  • 举报
回复
问题1:是整个为32

69,369

社区成员

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

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