请教以下代码的输出结果

crystalguoguo 2007-03-30 05:13:22
#include "stdafx.h"
#using <mscorlib.dll>
using namespace System;
using namespace std;

typedef struct st
{
int a:5;
int b:2;
}ST;

int _tmain()
{

ST st1;
char str[]="1357924680";
memcpy(&st1,str,sizeof(ST));
cout<<st1.a<<endl;
cout<<st1.b<<endl;
cout<<sizeof(ST)<<endl;

}

请教以上代码的输出?
我运行了,输出是:
-15
1
4
请教各位,为什么是这样的结果?谢谢了:-)
...全文
366 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
crystalguoguo 2007-04-17
  • 打赏
  • 举报
回复
谢谢h9999h!我最近看了有关这方面的文章,明白一些了。谢谢各位了!
h9999h 2007-04-03
  • 打赏
  • 举报
回复
结构内部数据对齐规则总结

有关的要点
1 对齐与编译时选择对齐方式有关系
2 与结构内数据的类型有关系

具体规则.
第一个结构成员后的每个结构成员将存储在成员中类型大小最大的类型的大小或 n 字节边界(其中 n 为 1、2、4、8 或 16)两者中较小的一个边界上。n字节边界是由/Zp[n]设置的。边界内不能容纳下一个数据,则补位,重起一个边界分配下一个数据。


举个例子
编译选项 /Zp1
表示使用1个字节进行对齐
struct{
short a1; // short 2个字节
short a2; //
int a3; // int 4个字节
char a4; // char 1个字节
short a5; //short 2个字节
long a6;// long 4个字节
char a7; // char 1个字节
__int64 a8; // unsigned 4个字节
}h;

编译选项 /Zp1
表示使用1个字节进行对齐
1个字节小于全部成员中类型最大的类型的大小,所以对齐以1个字节为基准
所以实际每个数据分配内存后,下一个数据会紧接着分配,不会有空位来补充。所以最后的输出是24个字节。

编译选项 /Zp2
表示使用2个字节进行对齐
2个字节小于全部成员中类型最大的类型的大小,所以对齐以2个字节为基准
我们看一下,
a1为2个字节,分配2个字节
a2为2个字节,紧跟a1分配2个字节
a3为4个字节,紧跟a2分配4个字节
a4为1个字节,紧跟a3分配1个字节
a5为2个字节,a4后面现在是单数位置,补1个字节才是2个字节的边界,a4后面补1个字节的空位,a5然后分配2个字节
a6为4个字节,紧跟a5分配4个字节
a7为1个字节,紧跟a6分配1个字节
a8为8个字节,a7后面现在是单数位置,补1个字节才是2个字节的边界,a7后面补1个字节的空位,a8然后分配8个字节
所以总共是26个字节

编译选项 /Zp4
表示使用4个字节进行对齐
4个字节小于全部成员中类型最大的类型的大小,所以对齐以4个字节为基准
a1为2个字节,分配2个字节
a2为2个字节,紧跟a1分配2个字节
a3为4个字节,紧跟a2分配4个字节
a4为1个字节,紧跟a3分配1个字节
a5为2个字节,a4后面现在是单数位置,补1个字节才是2个字节的边界,a4后面补1个字节的空位,a5然后分配2个字节
a6为4个字节,紧跟a5分配4个字节
a7为1个字节,紧跟a6分配1个字节
a8为8个字节,a7后面现在是单数位置,补3个字节才是新的4个字节的边界,a7后面补3个字节的空位,a8然后分配8个字节
所以总共是28个字节

编译选项 /Zp8
表示使用8个字节进行对齐
8个字节等于全部成员中类型最大的类型的大小,所以对齐以8个字节为基准
a1为2个字节,分配2个字节
a2为2个字节,紧跟a1分配2个字节
a3为4个字节,紧跟a2分配4个字节
a4为1个字节,紧跟a3分配1个字节
a5为2个字节,a4后面现在是单数位置,补1个字节才是2个字节的边界,a4后面补1个字节的空位,a5然后分配2个字节
a6为4个字节,紧跟a5分配4个字节
a7为1个字节,紧跟a6分配1个字节
a8为8个字节,a7后面现在是单数位置,补7个字节才是新的8个字节的边界,a7后面补7个字节的空位,a8然后分配8个字节
所以总共是32个字节

编译选项 /Zp16
表示使用16个字节进行对齐
16个字节大于全部成员中类型最大的类型的大小,所以对齐以成员中类型最大的类型的大小8个字节为基准
等同于/Zp8


在VC++.net 2005下,缺省是8字节边界对齐


结构的位域于此类似。
需要注意的是,连续的同类型只要大小总和在该类型范围内可以看作是一个类型进行分配。(这里win32下,int和long可以看作同类型,字节数相同)

例如:
struct {
char a1;
int a2;
int a3:1;
int a4: 5;
char a5: 3;
int a6:1;
short a7:1;
__int64 a9;
}tt;
相当于结构中有如下数据类型 char int int char int short __int64 数据进行分配

编译选项 /Zp1
表示使用1个字节进行对齐
1个字节小于全部成员中类型最大的类型的大小,所以对齐以1个字节为基准
所以总共是24个字节

编译选项 /Zp2
所以总共是26个字节
等等


现在总结是这样的,大家看看还有什么补充和不足的地方。
crystalguoguo 2007-04-03
  • 打赏
  • 举报
回复
哪位能详细讲解一下含有位域的结构体的sizeof()以及对齐和所占空间大小的问题呀?
whslovexyp 2007-04-03
  • 打赏
  • 举报
回复
http://blog.csdn.net/soloist/archive/2004/12/12/213717.aspx
介绍对齐的很不错的文章
taodm 2007-04-03
  • 打赏
  • 举报
回复
google “对齐”
crystalguoguo 2007-04-03
  • 打赏
  • 举报
回复
xxyyboy(壮志凌云)说

{
int a:5; //1个字节 只占用5位
int b:2; //1个字节 只占用2位
}ST; 也就是说这个结构体只占用了1个字节共8位。

但我运行时,语句cout<<sizeof(ST)<<endl;的输出结果是4 ,
说明结构体占用了4个字节。是怎么给a和b分配空间的?
crystalguoguo 2007-04-03
  • 打赏
  • 举报
回复

谢谢各位了!
freshui 2007-04-02
  • 打赏
  • 举报
回复
char str[]="1357924680";
首先把 第一个元素 "1" 拷贝到结构体中
字符"1"的arsc码是49,二进制是 00110001
所以
st1.a=10001 //二进制
st1.b=001 //二进制
由于st1.a最高位为1,是一个负数,因此用补码表示,区反加一得-15

crystalguoguo 2007-04-02
  • 打赏
  • 举报
回复
typedef struct st
{
int a:5;
int b:2;
}ST;

中int a:5 和int b:2; 是什么意思?这个结构体数据的大小是4个字节,那把str中前4 个字节的数据拷贝到st1中,为什么st1.a =-15 ,st1.b=1?
crystalguoguo 2007-04-02
  • 打赏
  • 举报
回复
这是一道笔试题目,没有运行,如何求出输出结果?
taodm 2007-04-02
  • 打赏
  • 举报
回复
google “字节序”/“大小头” 和 “对齐”
crystalguoguo 2007-04-02
  • 打赏
  • 举报
回复
请教jixingzhong,能讲得详细一点吗?谢谢了。
KenYuan2016 2007-04-02
  • 打赏
  • 举报
回复
这里考的就是 位域
不过位域实在空间有限的情况下和通信这种系统中用到,其他状况下现在内存这么多,用这个太麻烦,算来算去。
taodm 2007-04-02
  • 打赏
  • 举报
回复
原来楼主连“位域”都还没听说过。看来要补课的东西蛮多的。
KenYuan2016 2007-04-02
  • 打赏
  • 举报
回复
typedef struct st
{
int a:5; //1个字节 只占用5位
int b:2; //1个字节 只占用2位
}ST; 也就是说这个结构体只占用了1个字节共8位。 后面的1算就知道了



int _tmain()
{

ST st1;
char str[]="1357924680";
memcpy(&st1,str,sizeof(ST));
cout<<st1.a<<endl;
cout<<st1.b<<endl;
cout<<sizeof(ST)<<endl;

}
长尾巴的悟空 2007-03-30
  • 打赏
  • 举报
回复
晕,都什么情况
lovesnow1314 2007-03-30
  • 打赏
  • 举报
回复
http://www.cppblog.com/saga/archive/2006/05/28/7774.html

http://www.yuanma.org/data/2006/1121/article_1839.htm
jixingzhong 2007-03-30
  • 打赏
  • 举报
回复
1 结构体内存布局
2 拷贝数据内容
3 结构体内存对齐

64,646

社区成员

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

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