1. 用结构体位字段,例如:
struct
{
//冒号后的数字表示字段的宽度,如1表示1位
//变量必须声明成unsigned int
unsigned int key : 1;
unsigned int ex : 1;
unsigned int stat : 1;
} flag;
上面的struct声明了三个位(key、ex和stat),使用的时候可以直接应用:
flag.key = 1; //置位
flag.ex = 0; //复位
你说的sizeof的问题,是因为要对齐,因为一个位至少要占用1个整型(反之,一个整型最多保存32位)。所以,当你的字段个数在1--32之间时,sizeof就是4,而当字段为33--64时,就占用2个整形,sizeof就是8,以此类推。
如果你想减成2字节,类型就不要用unsigned int,改用unsigned short
2.
在标准C语言中,下面的语句是合法的
struct test{
int a:3;
};
这样定义的a在赋值后只取最后的3bit,即转换为-4到3 之间的数值。比如:
赋值 |
-5 |
-4 |
-3 |
-2 |
2 |
3 |
4 |
5 |
实际值 |
3 |
-4 |
-3 |
-2 |
2 |
3 |
-4 |
-3 |
如果 a 为无符号型,则会转换为 0 到 7 之间。且同样适用于非 int 的其他类型(只是“:”后面的数和显示 a 的结果时一定要是整型)。
赋值-5(dec)=1101(原)=1011(补),所以在进行取后3位操作后变成 3(dec)
赋值-4(dec)=1100(原)=1100(补),所以在进行取后3位操作后变成-4(dec)
取得的后3位100表示有符号数的补码,最高位的1表示该数字为负数,00表示其其绝对值的大小,但是00是补码的形式,需要取反加一才是其原码形式。绝对值加上其符号就是-4了!
取反 加一
00 ------> 11 ------> 100 = 4(dec)
---------------------------------------
#include
struct hc_driver
{
int saw_irq : 3;
};
int main()
{
printf("sizeof(unsigned) = %d\n", sizeof(unsigned)); //(1)
struct hc_driver hcd;
hcd.saw_irq = 4;
printf("hcd.saw_irq = %d\n", hcd.saw_irq);
}
(1) unsigned 默认表示 unsigned int
运行结果:
sizeof(unsigned) = 4
hcd.saw_irq = -4
阅读(926) | 评论(0) | 转发(0) |