c sizeof的问题

oosmile 2011-11-04 03:46:42
typedef struct
{
unsigned name:8; //名称
unsigned type:8; //数据类型
unsigned data:8; //数据
}DataModeA;

typedef struct
{
unsigned name:8;
unsigned type:8;
unsigned data:16;
}DataModeB;

typedef struct
{
unsigned name:8;
unsigned type:8;
unsigned data:32;
}DataModeC;

sizeof计算结果
sizeof(DataModeA) = 4;
sizeof(DataModeB) = 4;
sizeof(DataModeC) = 8;

什么问题啊?
...全文
94 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
codesnail 2011-11-04
  • 打赏
  • 举报
回复
我晕 这帖子怎么到非技术区了。。。。。。。
oosmile 2011-11-04
  • 打赏
  • 举报
回复
哦,明白了,原来我的编译器unsigned默认unsigned int
codesnail 2011-11-04
  • 打赏
  • 举报
回复
位域可以理解为把一个结构体塞到一个变量里,你的例子就是unsigned int。
codesnail 2011-11-04
  • 打赏
  • 举报
回复
因为AA是结构体位域,unsigned就是unsigned int 所以是4
AB每个元素是一个字符,3个就是3喽,但是还是那句话,sizeof不能说明问题,它其实占用的还是四个字节。
oosmile 2011-11-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 oosmile 的回复:]
typedef struct
{
unsigned name:8; //名称
unsigned type:8; //数据类型
unsigned data:8; //数据
}DataModeAA;

typedef struct
{
unsigned char name; //名称
unsigned char type; //数据类型
unsigned char data; //数据
}DataModeAB;[/Quote]

帖子的目的是ABsize是3,AA size为什么是4?
codesnail 2011-11-04
  • 打赏
  • 举报
回复
位域是用在需要大量的压缩空间的时候,比如嵌入式当中有些情况下,存储空间比较紧张。。。。。。。
codesnail 2011-11-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 oosmile 的回复:]

typedef struct
{
unsigned name:8; //名称
unsigned type:8; //数据类型
unsigned data:8; //数据
}DataModeA;

typedef struct
{
unsigned char name; //名称
unsigned char type; //数据类型
unsigned char d……
[/Quote]
你的这种情况没有区别,既然位域的每段都是8位的,何不直接用unsigned char。。。。。。
codesnail 2011-11-04
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <stdlib.h>

typedef struct
{
unsigned char name:8; //小项名称
unsigned char type:8; //数据类型
unsigned char data:8; //数据
}DataModeA;

DataModeA a,b;

int main(void)
{
printf("%d,%d\n",&a,&b);
system("pause");
return 0;
}

lz看下这段代码的输出是多少?

sizeof不能说明什么问题,,,最主要你要理解什么是内存对齐,为什么要内存对齐。。。
oosmile 2011-11-04
  • 打赏
  • 举报
回复
typedef struct
{
unsigned name:8; //名称
unsigned type:8; //数据类型
unsigned data:8; //数据
}DataModeA;

typedef struct
{
unsigned char name; //名称
unsigned char type; //数据类型
unsigned char data; //数据
}DataModeA;

上面有什么区别吗?
oosmile 2011-11-04
  • 打赏
  • 举报
回复
xxxx,因为看了才有这个疑问,既然清楚你为何不说呢
codesnail 2011-11-04
  • 打赏
  • 举报
回复
我说了,google之,知识是学的不是灌的。
oosmile 2011-11-04
  • 打赏
  • 举报
回复
现在搞不懂
typedef struct
{
unsigned name:8; //名称
unsigned type:8; //数据类型
unsigned data:8; //数据
}DataModeA;
为什么一会是3一会是4
整个结构体的总大小为最宽基本类型成员大小的整数倍,后面的B,C好理解
oosmile 2011-11-04
  • 打赏
  • 举报
回复
memcpy(xxDataModeB,buff,4)
从一个数组buff里面copy出来4个数据,能对应name,type,data?

typedef struct
{
unsigned name:8; //名称
unsigned type:8; //数据类型
unsigned data:8; //数据
}DataModeA;

这个如果四个字节的话memcpy(xxDataModeA,buff,4),后面的一个字节放哪里了?
oosmile 2011-11-04
  • 打赏
  • 举报
回复
改动一下
typedef struct
{
unsigned char name:8; //小项名称
unsigned char type:8; //数据类型
unsigned char data:8; //数据
}DataModeA;

///////////////////////////////////////////////////////////////////

typedef struct
{
unsigned char name:8;
unsigned char type:8;
unsigned char data:16;
}DataModeB;



typedef struct
{
unsigned char name:8;
unsigned char type:8;
unsigned char data:32;
}DataModeC;


这样变成,3,4,8
codesnail 2011-11-04
  • 打赏
  • 举报
回复
lz的疑惑在哪?
这是内存对齐,google之。

1,075

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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