user-0 提问: 跪求：联合体中包涵结构体结构体中包涵位域的东东 整蒙了

回复:
user: user-1
content: 理解和讨论之前请先学会如何观察！

user: user-0
content: 引用 11 楼 u010165006 的回复:[quote=引用 5 楼 wsm19841205 的回复:]    [quote=引用 3 楼 u010165006 的回复:] unsigned int word;  // word是成员  恩，这个我知道的哈，以下是飞思卡尔单片机的底层，也有这个  byte Byte;就是不知道下面的值uvflag.Bit.flag3=1; uvflag.Bit.flag11=1;要变化 这个uvflag.word会跟着变化吗 /*** INTCR - Interrupt Control Register; 0x0000001E ***/ typedef union {   byte Byte;   struct {     byte             :1;      byte             :1;      byte             :1;      byte             :1;      byte             :1;      byte             :1;      byte IRQEN       :1;                                       /* External IRQ Enable */     byte IRQE        :1;                                       /* IRQ Select Edge Sensitive Only */   } Bits; } INTCRSTR; extern volatile INTCRSTR _INTCR @(REG_BASE + 0x0000001EUL); #define INTCR                           _INTCR.Byte #define INTCR_IRQEN                     _INTCR.Bits.IRQEN #define INTCR_IRQE                      _INTCR.Bits.IRQE  #define INTCR_IRQEN_MASK                64U #define INTCR_IRQE_MASK                 128U[/quote]   uvflag.Bit.flag11=1;要变化 这个uvflag.word会跟着变化吗 —————————————— union里面各个成员是共享（映射）同一块内存（低两个字节二者是重叠的，高两个字节只属于word成员）[/quote] 我大概知道了，Word和结构体都是union的成员变量，共用内存，所占内存取最大者，Word和结构体所占空间一样大，都是2个字节，其中一个变化另外一个也变化？（低两个字节二者是重叠的，高两个字节只属于word成员）这句是什么意思呀？ typedef union{ unsigned int Word; struct { unsigned int  flag0:1; unsigned int  flag1:1; unsigned int  flag2:1; unsigned int  flag3:1; unsigned int  flag4:1; unsigned int  flag5:1; unsigned int  flag6:1; unsigned int  flag7:1; unsigned int  flag8:1; unsigned int  flag9:1;	 unsigned int  flag10:1; unsigned int  flag11:1; unsigned int  flag12:1; unsigned int  flag13:1; unsigned int  flag14:1; unsigned int  flag15:1;	 }Bit; }UVFLAG;

user: user-0
content: 引用 14 楼 zhao4zhong1 的回复:仅供参考：#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)  多谢多谢你的例子，很清晰

user: user-1
content: 仅供参考：#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)

user: user-0
content: 引用 20 楼 zhao4zhong1 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。恩 说的太对了，调试断点很重要。多谢多谢啦！

user: user-2
content: 引用 18 楼 wsm19841205 的回复:[quote=引用 17 楼 u010165006 的回复:] word成员是unsigned int类型不是4个字节吗？你的是什么硬件平台，多少位的？ 是飞思卡尔16位的单片机哈[/quote] 那是2个字节

user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-1
content: 理解和讨论之前请先学会如何观察！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

user: user-0
content: 引用 17 楼 u010165006 的回复:word成员是unsigned int类型不是4个字节吗？你的是什么硬件平台，多少位的？ 是飞思卡尔16位的单片机哈

user: user-2
content: word成员是unsigned int类型不是4个字节吗？你的是什么硬件平台，多少位的？

user: user-3
content: 引用 2 楼 wsm19841205 的回复:[quote=引用 1 楼 lm_whales 的回复:] 这事坑人牌的，代码 定义了一个类型(别名)word ， 和 union 的一个成员 word  颇有混淆是非的嫌疑 那这句uvflag.word就不起什么作用了吧？是吗[/quote] 起作用。  这种代码只能蒙自己 蒙不了编译器 编译器能清晰的分辨出这两个标志符 只是你自己可能分辨不了，研究几回， 可能就懵了 不知道他们谁是谁了

user: user-3
content: 关于位段，，，，位顺序由 实现定义  例如 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 我们从心理上，不倾向于分辨他们 这是跟自己作对的做法

user: user-2
content: 引用 5 楼 wsm19841205 的回复:[quote=引用 3 楼 u010165006 的回复:] unsigned int word;  // word是成员  恩，这个我知道的哈，以下是飞思卡尔单片机的底层，也有这个  byte Byte;就是不知道下面的值uvflag.Bit.flag3=1; uvflag.Bit.flag11=1;要变化 这个uvflag.word会跟着变化吗 /*** INTCR - Interrupt Control Register; 0x0000001E ***/ typedef union {   byte Byte;   struct {     byte             :1;      byte             :1;      byte             :1;      byte             :1;      byte             :1;      byte             :1;      byte IRQEN       :1;                                       /* External IRQ Enable */     byte IRQE        :1;                                       /* IRQ Select Edge Sensitive Only */   } Bits; } INTCRSTR; extern volatile INTCRSTR _INTCR @(REG_BASE + 0x0000001EUL); #define INTCR                           _INTCR.Byte #define INTCR_IRQEN                     _INTCR.Bits.IRQEN #define INTCR_IRQE                      _INTCR.Bits.IRQE  #define INTCR_IRQEN_MASK                64U #define INTCR_IRQE_MASK                 128U[/quote]   uvflag.Bit.flag11=1;要变化 这个uvflag.word会跟着变化吗 —————————————— union里面各个成员是共享（映射）同一块内存（低两个字节二者是重叠的，高两个字节只属于word成员）

user: user-0
content: 引用 9 楼 user-4 的回复:[quote=引用 8 楼 wsm19841205 的回复:] [quote=引用 7 楼 user-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 谢谢哈， 这个是底层里的开头大写的Word的定义   #if defined(__CHAR_IS_16BIT__)   typedef  unsigned char      Word;   typedef    signed char      sWord; #elif defined(__SHORT_IS_16BIT__) && !defined(__INT_IS_16BIT__)   typedef  unsigned short     Word;   typedef    signed short     sWord; #elif defined(__INT_IS_16BIT__)   typedef  unsigned int       Word;   typedef    signed int       sWord;  小写的定义是typedef unsigned int word;  我写的这个unsigned int word;应该有点问题 正确的是word Word;  这个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;	 里面的小写没问题。 这样能说的通吗？[/quote]  语法上没问题，但是系统底层定义一个Word是unsigned char，然后自己定义一个word是unsigned int，这样可能存在误导。 [/quote]  引用 9 楼 user-4 的回复:[quote=引用 8 楼 wsm19841205 的回复:] [quote=引用 7 楼 user-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 谢谢哈， 这个是底层里的开头大写的Word的定义   #if defined(__CHAR_IS_16BIT__)   typedef  unsigned char      Word;   typedef    signed char      sWord; #elif defined(__SHORT_IS_16BIT__) && !defined(__INT_IS_16BIT__)   typedef  unsigned short     Word;   typedef    signed short     sWord; #elif defined(__INT_IS_16BIT__)   typedef  unsigned int       Word;   typedef    signed int       sWord;  小写的定义是typedef unsigned int word;  我写的这个unsigned int word;应该有点问题 正确的是word Word;  这个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;	 里面的小写没问题。 这样能说的通吗？[/quote]  语法上没问题，但是系统底层定义一个Word是unsigned char，然后自己定义一个word是unsigned int，这样可能存在误导。 [/quote]  引用 9 楼 user-4 的回复:[quote=引用 8 楼 wsm19841205 的回复:] [quote=引用 7 楼 user-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 谢谢哈， 这个是底层里的开头大写的Word的定义   #if defined(__CHAR_IS_16BIT__)   typedef  unsigned char      Word;   typedef    signed char      sWord; #elif defined(__SHORT_IS_16BIT__) && !defined(__INT_IS_16BIT__)   typedef  unsigned short     Word;   typedef    signed short     sWord; #elif defined(__INT_IS_16BIT__)   typedef  unsigned int       Word;   typedef    signed int       sWord;  小写的定义是typedef unsigned int word;  我写的这个unsigned int word;应该有点问题 正确的是word Word;  这个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;	 里面的小写没问题。 这样能说的通吗？[/quote]  语法上没问题，但是系统底层定义一个Word是unsigned char，然后自己定义一个word是unsigned int，这样可能存在误导。 [/quote]  恩，我再看看哈，欧洲杯看吗？马上开始啦，西班牙 VS2016 捷克 哈哈

user: user-4
content: 引用 8 楼 wsm19841205 的回复:[quote=引用 7 楼 user-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 谢谢哈， 这个是底层里的开头大写的Word的定义   #if defined(__CHAR_IS_16BIT__)   typedef  unsigned char      Word;   typedef    signed char      sWord; #elif defined(__SHORT_IS_16BIT__) && !defined(__INT_IS_16BIT__)   typedef  unsigned short     Word;   typedef    signed short     sWord; #elif defined(__INT_IS_16BIT__)   typedef  unsigned int       Word;   typedef    signed int       sWord;  小写的定义是typedef unsigned int word;  我写的这个unsigned int word;应该有点问题 正确的是word Word;  这个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;	 里面的小写没问题。 这样能说的通吗？[/quote]  语法上没问题，但是系统底层定义一个Word是unsigned char，然后自己定义一个word是unsigned int，这样可能存在误导。

user: user-0
content: 引用 7 楼 user-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 谢谢哈， 这个是底层里的开头大写的Word的定义   #if defined(__CHAR_IS_16BIT__)   typedef  unsigned char      Word;   typedef    signed char      sWord; #elif defined(__SHORT_IS_16BIT__) && !defined(__INT_IS_16BIT__)   typedef  unsigned short     Word;   typedef    signed short     sWord; #elif defined(__INT_IS_16BIT__)   typedef  unsigned int       Word;   typedef    signed int       sWord;  小写的定义是typedef unsigned int word;  我写的这个unsigned int word;应该有点问题 正确的是word Word;  这个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;	 里面的小写没问题。 这样能说的通吗？

user: user-4
content: 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

user: user-0
content: 引用 4 楼 u010165006 的回复:[quote=引用 2 楼 wsm19841205 的回复:] [quote=引用 1 楼 lm_whales 的回复:] 这事坑人牌的，代码 定义了一个类型(别名)word ， 和 union 的一个成员 word  颇有混淆是非的嫌疑 那这句uvflag.word就不起什么作用了吧？是吗[/quote]  UVFLAG这个union最长就是unsigned int word 成员 4个字节，Bit这个结构体成员只有2个字节。 uvflag.Bit.flag3=1; uvflag.word的值是多少呀？ 个人觉得应该是8（二进制第4位为1） [/quote]

user: user-0
content: 引用 3 楼 u010165006 的回复:unsigned int word;  // word是成员  恩，这个我知道的哈，以下是飞思卡尔单片机的底层，也有这个  byte Byte;就是不知道下面的值uvflag.Bit.flag3=1; uvflag.Bit.flag11=1;要变化 这个uvflag.word会跟着变化吗 /*** INTCR - Interrupt Control Register; 0x0000001E ***/ typedef union {   byte Byte;   struct {     byte             :1;      byte             :1;      byte             :1;      byte             :1;      byte             :1;      byte             :1;      byte IRQEN       :1;                                       /* External IRQ Enable */     byte IRQE        :1;                                       /* IRQ Select Edge Sensitive Only */   } Bits; } INTCRSTR; extern volatile INTCRSTR _INTCR @(REG_BASE + 0x0000001EUL); #define INTCR                           _INTCR.Byte #define INTCR_IRQEN                     _INTCR.Bits.IRQEN #define INTCR_IRQE                      _INTCR.Bits.IRQE  #define INTCR_IRQEN_MASK                64U #define INTCR_IRQE_MASK                 128U

user: user-2
content: 引用 2 楼 wsm19841205 的回复:[quote=引用 1 楼 lm_whales 的回复:] 这事坑人牌的，代码 定义了一个类型(别名)word ， 和 union 的一个成员 word  颇有混淆是非的嫌疑 那这句uvflag.word就不起什么作用了吧？是吗[/quote]  UVFLAG这个union最长就是unsigned int word 成员 4个字节，Bit这个结构体成员只有2个字节。 uvflag.Bit.flag3=1; uvflag.word的值是多少呀？ 个人觉得应该是8（二进制第4位为1）