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;不是重复了吗?
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
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
我们从心理上,不倾向于分辨他们
这是跟本人作对的做法
例如
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、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!