unsigned int foo : 32 这种定义什么意思?

yishunli 2005-01-10 02:11:38
看到一代码如下,请帮忙解释这种定义方法是什么意思?
(结构我懂,我问的是结构体里定义变量的方法,为什么要有冒号,为什么后面再加一个数字?)

顺便再问一下,*.bpr是什么编译器(C\C++)的工程文件?

代码:
#typedef unsigned int u_int

typedef struct {
u_int foo : 32;
u_int len_time : 32;
u_int vobu_start : 32; // 1st vobu start
u_int ilvu_end : 32;
u_int vobu_last_start : 32;
u_int vobu_last_end : 32;
} ifo_pgci_cell_addr_t;
...全文
282 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
eggaig 2005-01-10
  • 打赏
  • 举报
回复
u_int foo : 32;

32位表示foo
yishunli 2005-01-10
  • 打赏
  • 举报
回复
明白了,谢谢各位,呵呵,多谢!
CMyMfc 2005-01-10
  • 打赏
  • 举报
回复
第一个内存分布为
1 + 31 // 4byte
7 + 1 // 4byte

第二个内存分布为
1 + 31 // 4byte , 后bit为编译器所加
32 // 4byte
7 + 1 // 4byte
yishunli 2005-01-10
  • 打赏
  • 举报
回复
定义一个结构变量info,输出info的内存占用值,两种定义得到的结果如下:

1、定义1:
typedef struct
{
unsigned int :1;
unsigned int :31;
unsigned char :7;
unsigned char :1;
} info_str ;

sizeof(info)输出为8

2、定义2:
typedef struct
{
unsigned int :1;
unsigned int :32;
unsigned char :7;
unsigned char :1;
} info_str ;
sizeof(info)输出为12
请问这两种定义的内存分配有什么不同?分别是如何分配的?
idler 2005-01-10
  • 打赏
  • 举报
回复
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_clang_C_Bit_Fields.asp?frame=true
yishunli 2005-01-10
  • 打赏
  • 举报
回复
我在VC++下也可以这样写了,刚才是写错了,呵呵
我这样定义:
typedef struct
{
int :16;
int :16;
unsigned char :4;
} info_str ;
编译通过,但是我还是不明白这样用的用意,我觉得这样也不好访问,而且也不知道怎么用这些变量(地址空间)。
somedummy 2005-01-10
  • 打赏
  • 举报
回复
填在那里也不能说编译器说了算,还是看整个struct里面是怎么安排的
CMyMfc 2005-01-10
  • 打赏
  • 举报
回复
to somedummy:
我的意思是自己加上u_int : 24后, 更方便根据偏移得到成员的地址, 这样减少出错的几率,
因为自己不加, 编译器还是会填充字节, 填在哪编译器说了算
idler 2005-01-10
  • 打赏
  • 举报
回复
这个是位段,在MSDN里面找bit field。
CMyMfc 2005-01-10
  • 打赏
  • 举报
回复
这种定义vc下是可以的, 不知你那里提示什么错误?
#typedef unsigned int u_int
改为
typedef unsigned int u_int;
yishunli 2005-01-10
  • 打赏
  • 举报
回复
谢谢 某人马甲,我在VC++下去做这个程序应该注意什么问题呢,这是一个解读配置文件的程序,把文件读入内存,按地址读取内容的。
呵呵,还请大家多多讨论,谢谢!
yishunli 2005-01-10
  • 打赏
  • 举报
回复
谢谢“星际人生:=E.F=FlyForEver” ,我知道了这个是Brand C 里面的用法,那么如果我要想把这个程序移植到VC++ 6.0下,对这些处理应该怎么变化呢?我现在移植后出现读文件不正常的情况,也就是读出的信息是错误的。我想可能和编译器之间的区别有关,那么我想知道,在VC++下如何处理这些对齐?或者根本都不用管呢?
我在VC++下试了一下,用这种定义方法不行的,编译不能通过!
请各位帮忙!
somedummy 2005-01-10
  • 打赏
  • 举报
回复
这个应该和对齐没有什么关系吧?bitfield本来就和对齐撤不上什么关系,设置一个1bit的bit fileld还是会被设置为最少1字节(后面如果没有其他的bitfield的话),和对齐有关的应该是pragma指令控制编译器的行为
greenteanet 2005-01-10
  • 打赏
  • 举报
回复
那是定义32bit的大小.
CMyMfc 2005-01-10
  • 打赏
  • 举报
回复
你的编译器默认是4个字节对齐, 你不加u_int :24, 编译器会给你加上3个字节内存凑齐4字节对齐
为了自己控制对齐, 便自己加了
liem 2005-01-10
  • 打赏
  • 举报
回复
struct structName{
int i:4;
...
};
冒号后加数字是位段,表示该成员要用4个bit.
CMyMfc 2005-01-10
  • 打赏
  • 举报
回复
应该是为了显式对齐吧
yishunli 2005-01-10
  • 打赏
  • 举报
回复
但是这要去掉这些位数表示呢?有没有影响,还有啊,我看到原代码中有这样的定义:
typedef struct {
u_int : 24; // don't know
u_char tu : 8; // time unit (in seconds)
} ifoq_tmt_hdr_t;

那不是说,可以只指定数据类型,而不指定变量名称吗?还请多指教!
somedummy 2005-01-10
  • 打赏
  • 举报
回复
bit field位域,用来指定一个数据到底占有多少个二进制位

u_int foo:32的意思就是声明一个u_int的数据类型的对象foo,它占有32个bit(但是u_int这个类型必须不少于32bit才行)

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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