首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

内存分配如何是这样

2012-03-11 
内存分配怎么是这样?#includestdio.hstructtime{intyear/*年*/intmonth/*月*/intday/*日*/}uniondig

内存分配怎么是这样?
#include   <stdio.h>
struct   time
{
int   year;         /*年*/
int   month;   /*月*/
int   day;                   /*日*/
};
union   dig
{
struct   time   data;   /*           嵌套的结构体类型*/
char   byte[6];
};
void   main()
{
union   dig   unit;
int   i;
printf( "enter   year:\n ");
scanf( "%d ",&unit.data.year);             /*输入年*/
printf( "enter   month:\n ");
scanf( "%d ",&unit.data.month);           /*输入月*/
printf( "enter   day:\n ");
scanf( "%d ",&unit.data.day);               /*输入日*/
printf( "year=%d       month=%d       day=%d\n ",         unit.data.year,unit.data.month,   unit.data.day);             /*打印输出*/
for(i=0;i <6;i++)
printf( "%d, ",unit.byte[i]);       /*按字节以十进制输出*/
printf( "\n ");
}
//最后对结果的解释搞不懂
//运行程序:
//RUN   ?
//enter   year:
//1976   ?
//enter   month:
//4?
//enter   day:
//23?
//year=1976           month=4         day=23
//184,7,4,0,23,0

//从程序的输出结果来看,   1976占两个字节,由第0、1字节构成,即7×256+184=1976。4   同样占两个字节,由第2、3字节构成,0×256+4=4,23由第4、5字节构成,23=0×256+23。

////////////////////////////
这个题目的解答中,7×256+184=1976;0×256+4=4;23=0×256+23.是怎么算出来的?

[解决办法]
不建议用union结构,因为改变一个数据成员的时候,很可能导致别的数据成员改变,而出现些

莫名其妙的错误。如果只是想保存年月日,根本不用那么麻烦

年份可以用两位数字表示,如76,月份最多也就是两位,如12,日期最多也就是两位,如31

然后分析:

年份的范围是 00 - 99 ,对应的最大的二进制数字是 1100001 用 7位就能保存下

月份的范围是 01 - 12 ,对应的最大的二进制数字是 1100 用 4位就能保存下

日期的范围是 01 - 31 ,对应的最大的二进制数字是 11111 用 5位就能保存下

7 + 4 + 5 == 16,正好用一个 short 保存下年月日,既节省空间,效率又高
[解决办法]
编译器是TC的吧,int占2 个字节,比如year的两个字节的值是184,7,根据每个字节的值以及系统的indian特性就可以计算出来int的值。

to fetag(过儿思念小龙女), 不是我给新手泼凉水,你的水平还太低了,下结论之前最好多翻翻资料。比如你评价union,他本来就是比较特殊的数据结构,不是随随便便就使用的.

热点排行
Bad Request.