Chinaunix首页 | 论坛 | 博客
  • 博客访问: 351508
  • 博文数量: 157
  • 博客积分: 3001
  • 博客等级: 中校
  • 技术积分: 1330
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-06 13:47
文章分类

全部博文(157)

文章存档

2011年(1)

2010年(28)

2009年(124)

2008年(4)

我的朋友

分类: WINDOWS

2009-10-21 14:40:49

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
阅读(882) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~