结构中“:”的用法的问题(见里)

fjliningcd 2004-11-23 11:28:27
struct{
unsigned i :1;
}tt;
这里“:”是表示什么意思。
...全文
120 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Agemo 2004-11-23
  • 打赏
  • 举报
回复
所以,结论:代码空间也是空间哦。:)
Agemo 2004-11-23
  • 打赏
  • 举报
回复
而且就你把我那个struct的顺序改一下而言,表面上好像是节省了空间,但是你又没想过,你在访问i和n这两个变量时,又没想过,编译器会产生多一点机器指令呢?一条机器指令又是多少空间呢?事实上很有可能既没省空间,而且执行效率又低哦。当然罗,我没否认确实省空间的情况哦。
Agemo 2004-11-23
  • 打赏
  • 举报
回复
楼上的,我可没有否认可以节省空间哦,
有必要这样来争吗?:)
请你关注我的重点句好吗?
为了省那么几位,而牺牲执行效率不值得哦
pomelowu 2004-11-23
  • 打赏
  • 举报
回复
To Agemo(加米欧) :

你说的东西涉及到字节对齐的问题了。
而我说的节省空间是指:
struct test_struct
{
int i:3;
int j:4;
int k:1;
};

这样,sizeof(test_struct)的结果还是1个int型的空间,但是已经有3个变量,难道不算是节省空间了吗?

而同样就是你的代码,改变一下储存顺序:
struct test_struct
{
unsigned i : 1;
unsigned n : 5;
int j;
};
你看看sizeof(test_struct)的结果呢?
houdy 2004-11-23
  • 打赏
  • 举报
回复
搞底层开发的可能对这个比较感兴趣.我觉得写程序开发的就没有比较这样搞了,代码并不是很清晰.
Agemo 2004-11-23
  • 打赏
  • 举报
回复
就连编译器也认为就为了省那么几位,而牺牲执行效率不值得哦,hoho
不过我用的是VC 6.0,os是winXP
不知道在嵌入式os上,那些编译器是否会节省空间哦(当然这个节省是相对的,比如机器寻址不是32位的,也就是比较的基准要基于同一机器寻址)
Agemo 2004-11-23
  • 打赏
  • 举报
回复
#include <stdio.h>

struct test_struct
{
unsigned i : 1;
int j;
unsigned n : 5;
};

int main(int argc, char *argv[])
{
printf("size: %d", sizeof(struct test_struct));

return 0;
}

程序输出:
size: 12

所以并不省空间哦。
zjraycj 2004-11-23
  • 打赏
  • 举报
回复
这是结构体中的位域的表示方法啊
sharkhuang 2004-11-23
  • 打赏
  • 举报
回复
最近问这个问题的满多啊
Agemo 2004-11-23
  • 打赏
  • 举报
回复
节省空间?在一般情况下我看也省不了
ynotgo 2004-11-23
  • 打赏
  • 举报
回复
学习了
莫情莫钱 2004-11-23
  • 打赏
  • 举报
回复
哦.原来是这样的啊
学习了
pomelowu 2004-11-23
  • 打赏
  • 举报
回复
默认在Win32系统下,unsigned int 占用4个字节空间。可是如果为了节省空间,或者觉得不可能储存那么大的数字的时候就可以用":"指定占用空间的大小,“:”后的数字表示占用的bit数
tianhxk 2004-11-23
  • 打赏
  • 举报
回复
表示i只有一个bit位哦
pomelowu 2004-11-23
  • 打赏
  • 举报
回复
楼上错,表示i这个变量只占用 1 bit 空间
MCR 2004-11-23
  • 打赏
  • 举报
回复
字节对齐
这里表示是一个字节对齐
fjliningcd 2004-11-23
  • 打赏
  • 举报
回复

谢谢各位!
特别是:
pomelowu(羽战士), oofa_sam()等讲的都挺完善的。
我问这个问题就是用来解决oofa_sam()提到的芯片问题:
“比如某些芯片的register就是按照bit来定义的,所以写驱动的时候只有按位来定义struct”
oofa_sam 2004-11-23
  • 打赏
  • 举报
回复
我也说一句:)
这样定义结构体确实会省空间啊,而且有时候还不得不这样定义。
比如某些芯片的register就是按照bit来定义的,所以写驱动的时候只有按位来定义struct
操作起来才比较方便,效率也很高的。
不过,这是因为硬件已经决定了struct中bit成员的值域。而对于上层APP的程序就没有必要这样来定义了,防止溢出(控制这样的bit变量溢出是比较麻烦的:))

69,364

社区成员

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

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