c struct 中: 的作用

lwb723 2007-10-29 10:29:16
typedef struct
{
unsigned int t1:14;
int t2:2;
char mpleft:3;
}Test;

在VC6中,Test tt;
其中 tt.t1为3276
tt.t2为-1
tt.t3为'?

问下这个 结构中的 ":"是起的什么作用啊?
...全文
846 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnvb 2007-10-29
  • 打赏
  • 举报
回复
原来结构体也可以这么赋值的。谢谢9楼的小龙女.
wild_fox86116 2007-10-29
  • 打赏
  • 举报
回复
来晚了
那个就是规定它占几个位的意思
不写就代表默认的
看看下面这个帖子吧,顺便可以了解一下sizeof,哈哈
http://topic.csdn.net/u/20071028/11/3cbd396a-b4dc-42db-85cb-9cfaf9612d1a.html
独孤过儿 2007-10-29
  • 打赏
  • 举报
回复
这个是驱动中赋值的两种方法,算是我的道歉吧:

struct file_operations fops = {
read: device_read,
write: device_write,
open: device_open,
release: device_release
};

struct file_operations fops = {
.read = device_read,
.write = device_write,
.open = device_open,
.release= device_release
};
独孤过儿 2007-10-29
  • 打赏
  • 举报
回复
抱歉啊,楼主,我看花眼了,没看到前面那个 typedef,想成是驱动里面的那种赋值了。

lwb723 2007-10-29
  • 打赏
  • 举报
回复
非常感谢!!!
独孤过儿 2007-10-29
  • 打赏
  • 举报
回复
啊!不好意思,看错了,上一贴作废
cnvb 2007-10-29
  • 打赏
  • 举报
回复
位域

有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如
在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并
使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是
把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域
名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位
域来表示。一、位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为:
struct 位域结构名
{ 位域列表 };
其中位域列表的形式为: 类型说明符 位域名:位域长度
例如:
struct bs
{
int a:8;
int b:2;
int c:6;
};
位域变量的说明与结构变量说明的方式相同。 可采用先定义后说明,同时定义说明或者直
接说明这三种方式。例如:
struct bs
{
int a:8;
int b:2;
int c:6;
}data;
说明data为bs变量,共占两个字节。其中位域a占8位,位域b占2位,位域c占6位。对于位
域的定义尚有以下几点说明:

1. 一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另
一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如:
struct bs
{
unsigned a:4
unsigned :0 /*空域*/
unsigned b:4 /*从下一单元开始存放*/
unsigned c:4
}
在这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4
位,c占用4位。

2. 由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能
超过8位二进位。

3. 位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例
如:
struct k
{
int a:1
int :2 /*该2位不能使用*/
int b:3
int c:2
};
从以上分析可以看出,位域在本质上就是一种结构类型, 不过其成员是按二进位分配
的。

二、位域的使用位域的使用和结构成员的使用相同,其一般形式为: 位域变量名·位域
名 位域允许用各种格式输出。
main(){
struct bs
{
unsigned a:1;
unsigned b:3;
unsigned c:4;
} bit,*pbit;
bit.a=1;
bit.b=7;
bit.c=15;
printf("%d,%d,%d\n",bit.a,bit.b,bit.c);
pbit=&bit;
pbit->a=0;


以上内容转自网络
finney 2007-10-29
  • 打赏
  • 举报
回复
这个是位域,可以用来节约存储空间


typedef struct
{
unsigned int t1:14; //用uint的低14位,数值从0~2^14-1,如果赋的值超过最大值,则会变为0,以下以此类推
int t2:2;
char mpleft:3;
}Test;
proware 2007-10-29
  • 打赏
  • 举报
回复
百度下"位域"这个关键词...
独孤过儿 2007-10-29
  • 打赏
  • 举报
回复
忘记这是谁的写法了,反正 GNU 和 C99 各自定义了一种新的结构体赋值方法,一种是你写的这样的,还有一种是这样的:

struct test
{
.a = 10;
.b = 20;
};

其实质就是对结构体的成员赋值。
lwb723 2007-10-29
  • 打赏
  • 举报
回复
帅哥门,给个答案列。自己顶下。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧