Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4840444
  • 博文数量: 930
  • 博客积分: 12070
  • 博客等级: 上将
  • 技术积分: 11448
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-15 16:57
文章分类

全部博文(930)

文章存档

2011年(60)

2010年(220)

2009年(371)

2008年(279)

分类: LINUX

2009-01-04 23:52:30

   最近一直在搞内核,以前不是没用过u_int16_t,还没见过u_int16_t:1等等,没吃过猪肉还没见过猪吗^_^.真真自己写,还真没用过,以前都是学校的项目,出结果就行.效率,空间,一切不考虑!惭愧惭愧.最近呆在一个地方,真的很happy^_^.
   这些包含在#include

#include <stdio.h>


int main()
{
    union
    {
        struct
        {
            unsigned short s1:3;
            unsigned short s2:3;
            unsigned short s3:3;
        }x;
        unsigned int c;
    }v;
    v.c=100;
    printf("%d\n",v.x.s3);
    return 0;
}

printf是多少呢??
答案是
-----------------------------
二、位结构
位结构是一种特殊的结构, 在需按位访问一个字节或字的多个位时, 位结构
比按位运算符更加方便。
位结构定义的一般形式为:
struct位结构名{
数据类型 变量名: 整型常数;
数据类型 变量名: 整型常数;
} 位结构变量;
其中: 数据类型必须是int(unsigned或signed)。 整型常数必须是非负的整数, 范围是0~15, 表示二进制位的个数, 即表示有多少位。
变量名是选择项, 可以不命名, 这样规定是为了排列需要。
例如: 下面定义了一个位结构。
struct{
unsigned incon: 8; /*incon占用低字节的0~7共8位*/
unsigned txcolor: 4;/*txcolor占用高字节的0~3位共4位*/
unsigned bgcolor: 3;/*bgcolor占用高字节的4~6位共3位*/
unsigned blink: 1; /*blink占用高字节的第7位*/
}ch;
位结构成员的访问与结构成员的访问相同。
例如: 访问上例位结构中的bgcolor成员可写成:
ch.bgcolor

注意:
1. 位结构中的成员可以定义为unsigned, 也可定义为signed, 但当成员长度为1时, 会被认为是unsigned类型。因为单个位不可能具有符号。
2. 位结构中的成员不能使用数组和指针, 但位结构变量可以是数组和指针, 如果是指针, 其成员访问方式同结构指针。
3. 位结构总长度(位数), 是各个位成员定义的位数之和, 可以超过两个字节。
4. 位结构成员可以与其它结构成员一起使用。
例如:
struct info{
char name[8];
int age;
struct addr address;
float pay;
unsigned state: 1;
unsigned pay: 1;
}workers;'
上例的结构定义了关于一个工从的信息。其中有两个位结构成员, 每个位结构成员只有一位, 因此只占一个字节但保存了两个信息, 该字节中第一位表示工人的状态, 第二位表示工资是否已发放。由此可见使用位结构可以节省存贮空间。

-----------------------------
结构struct x,有三个成员s1,s2,s3每一个成员占3 bit,
结构与char c union ;
char 一般机器占一个字节(8 bit ,100 二进制值为:01100100,所以s1后三bit(6,7,8 bit) :100
s2为中间三位(3,4,5 bit)为100 s3为01,所以printf("%d\n",v.x.s3)是1,其它是4
-----------------------------
现在大多数系统都是将低字位放在前面,而结构体中位域的申明一般是先声明高位。

100 的二进制是 001 100 100

低位在前 高位在后

001----s3

100----s2

100----s1

所以结果应该是 1

如果先申明的在低位则:

001----s1

100----s2

100----s3

结果是 4
-----------------------------
其中unsigned short s1:3; 中的“:”又是什么意思?
指定位段, 3代表预定s1占3bit.

为什么是4?
struct
{
unsigned short s1:3; //一个字节. 虽然预定为3bit,但系统的存储空间为至少一字节.
unsigned short s2:3;

好了时间不早了,明天继续补上

阅读(1850) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~