:联合体中包涵结构体结构体中包涵位域的东东 整蒙了

C语言 码拜 9年前 (2016-04-10) 1347次浏览
typedef unsigned int word;
typedef union{
unsigned int word;
struct {
word flag0:1;
word flag1:1;
word flag2:1;
word flag3:1;
word flag4:1;
word flag5:1;
word flag6:1;
word flag7:1;
word flag8:1;
word flag9:1;
word flag10:1;
word flag11:1;
word flag12:1;
word flag13:1;
word flag14:1;
word flag15:1;
}Bit;
}UVFLAG;
extern UVFLAG uvflag;
疑问1:
例如
uvflag.Bit.flag3=1;
uvflag.word的值是多少呀?
例如
uvflag.Bit.flag3=1;
uvflag.Bit.flag11=1;
uvflag.word的值是多少呀?
真的是不懂,typedef unsigned int word;还有这条语句和unsigned int word;不是重复了吗?
解决方案

4

typedef unsigned int word;
unsigned int word;
这两句确实有问题,但不是语法问题,本人猜作者的意思是:
typedef unsigned int word;

word word;
有关位域
https://msdn.microsoft.com/en-us/library/ewwyfdbe.aspx
https://msdn.microsoft.com/en-us/library/yszfawxh.aspx
http://www.tutorialspoint.com/cprogramming/c_bit_fields.htm

4

关于位段,,,,位顺序由 实现定义
例如
typedef unsigned char uchar;
union{
uchar uc;
struct {
uchar  b0:1;
uchar  b1:1;
uchar  b2:1;
uchar  b3:1;
uchar  b4:1;
uchar  b5:1;
uchar  b6:1;
uchar  b7:1;
}pos;
struct {
uchar  b7:1;
uchar  b6:1;
uchar  b5:1;
uchar  b4:1;
uchar  b3:1;
uchar  b2:1;
uchar  b1:1;
uchar  b0:1;
}rev;
}flag;
flag.uc=0;
flag.pos.b0=1;===> flag.uc =0x80,或 0x01 不同实现,结果不同
flag.uc=0;
flag.rev.b0=1;===> flag.uc =0x01,或 0x80 不同实现,结果不同
这个联合体的情况大抵如此
不过,你这里,定义类型,和变量名相同,
虽然是允许的,确实是坑人的
同一个标志符,有两种不同的含义
他们的心理距离是0
我们从心理上,不倾向于分辨他们
这是跟本人作对的做法

4

仅供参考:

#include <stdio.h>
#include <stdlib.h>
char buf[17];
union U {
  unsigned short int aa;
  struct {
    unsigned int bb:7;//(bit 0-6)
    unsigned int cc:6;//(bit 7-12)
    unsigned int dd:3;//(bit 13-15)
  };
} u;
void main() {
                //bbbbbbbbbbbbbbbb
                //iiiiiiiiiiiiiiii
                //tttttttttttttttt
                //111111
                //5432109876543210
                //::::::::::::::::
    u.aa=0xE07F;//1110000001111111
    printf("bb==%d,cc==%d,dd==%d\n",u.bb,u.cc,u.dd);
    u.bb=0x41;
    u.cc=0x21;//dddccccccbbbbbbb
    u.dd=5;   //1011000011000001
    printf("aa==0x%04X==%016s(2)\n",u.aa,itoa(u.aa,buf,2));
}
//bb==127,cc==0,dd==7
//aa==0xB0C1==1011000011000001(2)

8

word成员是unsigned int类型不是4个字节吗?你的是什么硬件平台,多少位的?

4

:联合体中包涵结构体结构体中包涵位域的东东 整蒙了理解讨论之前请先学会怎么样观察
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明:联合体中包涵结构体结构体中包涵位域的东东 整蒙了
喜欢 (0)
[1034331897@qq.com]
分享 (0)