内存分配怎么是这样?
#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,他本来就是比较特殊的数据结构,不是随随便便就使用的.