哪位能解释下cout<
unhappyless 2006-09-07 12:46:37

#include<iostream>
using namespace std;
struct info
{
unsigned a:1; //整型常数必须是非负整数
signed b:1;
signed c:1;
int d:1;
int :32; //可以没有变量名,当占位符使用,赋值时会忽略
int age;
};

void main()
{

cout<<endl<<"sizeof info="<<sizeof(info)<<endl;
cout<<endl<<"int="<<sizeof(int)<<endl;
cout<<endl<<"signed="<<sizeof(signed)<<endl;
cout<<endl<<"unsigned="<<sizeof(unsigned)<<endl;
}
...全文
306 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
R9R9R9 2006-09-11
  • 打赏
  • 举报
回复
今天刚刚看到一些有关位域方面的资料,试着看能不能解释一下现在这个问题,呵呵

使用位域的主要目的是压缩存储,其大致规则为:
1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字
段将紧邻前一个字段存储,直到不能容纳为止;
2) 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字
段将从新的存储单元开始,其偏移量为其类型大小的整数倍;
3) 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方
式,Dev-C++采取压缩方式;
4) 如果位域字段之间穿插着非位域字段,则不进行压缩;
5) 整个结构体的总大小为最宽基本类型成员大小的整数倍。

struct info
{
unsigned a:1;
signed b:1;
signed c:1;
int d:1;
//以上类型一致(int)根据规则1可知,这前面四个的位宽之和为4,就相当于
int :32;
int age;
}
---->
struct info
{
int d:4;
int :32;
//再根据规则2,由于 4+32 > sizeof(int)即32位,所以无名位域int :32必须从下一个单元开始存储,偏移量为int类型大小的整数倍;
int age;
}
内存中的结构如下:

**** **** **** **** **** **** **** dcba -- a,b,c,d占据的4位
-- *为编译器在成员之间加上填充的位
xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx -- ind:32占据的32位
xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx -- age占据的32位

sizeof(info)=4+4+4=12,而不是1+1+1+1+4+4,像:

struct info2
{
unsigned a:4;
signed b:11;
signed c:1;
int d:8;
//4+11+1+8=24<32,都紧密的存储在前面的24位
int :32;
int age;
}
所以sizeof(info2)还是等于4+4+4=12

还是讲的很不清楚,错的地方,请大家改正啊。
unhappyless 2006-09-11
  • 打赏
  • 举报
回复
up
unhappyless 2006-09-09
  • 打赏
  • 举报
回复
我是想知道为什么是

unsigned a:1; 0:0
signed b:1; 0:1
signed c:1; 0:2
int d:1; 0:3

而不是

unsigned a:1; 1:0
signed b:1; 2:0
signed c:1; 3:0
int d:1; 4:0
yjukh 2006-09-08
  • 打赏
  • 举报
回复
因为它们四个是在前面
如果你把int age; 写在前面就又不一样了~
lj860603 2006-09-07
  • 打赏
  • 举报
回复
字节对齐问题。在这个结构体中占用字节数最大的是int型,所以4字节对齐。
unhappyless 2006-09-07
  • 打赏
  • 举报
回复
为了对齐,隔过第1,2,3字节

==============================================================================

unsigned a:1; 0:0
signed b:1; 0:1
signed c:1; 0:2
int d:1; 0:3

上面4个为什么不对齐?
minico 2006-09-07
  • 打赏
  • 举报
回复
struct info
{
unsigned a:1; 0:0
signed b:1; 0:1
signed c:1; 0:2
int d:1; 0:3
int :32; 4~7,为了对齐,隔过第1,2,3字节
int age; 8~11
};
加入字节从零开始,每个字节从零位开始的话;
注释中0:i表示占据第0字节的第i位;
m~n表示占据第m字节到第n字节。
unhappyless 2006-09-07
  • 打赏
  • 举报
回复
unsigned a:1; // 1 //整型常数必须是非负整数
signed b:1; // 1
signed c:1; // 1
int d:1; // 1

上面的总共用了 4 位,而从显示结果来看他们应该占了 4 字节。
YeTimmy 2006-09-07
  • 打赏
  • 举报
回复
int :32; 这是什么用法,没看到过:(
hslinux 2006-09-07
  • 打赏
  • 举报
回复
不好意思, unsigned a:1; // 1 //整型常数必须是非负整数
signed b:1; // 1
signed c:1; // 1
int d:1; // 1

这堆一起占4,按单字节对齐。
hslinux 2006-09-07
  • 打赏
  • 举报
回复
struct info
{
unsigned a:1; // 1 //整型常数必须是非负整数
signed b:1; // 1
signed c:1; // 1
int d:1; // 1
int :32; // 4 //可以没有变量名,当占位符使用,赋值时会忽略
int age; // 4
};

sizeof(info)=1+1+1+1+4+4=12

64,281

社区成员

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

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