读书人

知名企业技术2名的题约20行代码上

发布时间: 2013-01-21 10:15:38 作者: rapoo

知名企业技术2名的题,约20行代码,下面题目的答案是什么?和大小端有关系吗,有和无,请说明理由,求大拿给个标准答案和标准分析,急求,谢谢!


union
{int i;
char x[2];
}a;
void main()
{
a.x[0] = 10;
a.x[1] = 1;
printf("%d",a.i);
}
第二题
main()
{
uinon
{
int i;
struct
{
char first;
char second;
}half;
}
number;
number.i=0x4241;
printf("%c%c\n",number.half.first,number.half.second);
number.half.first ='a';
number.half.second ='b';
printf("%x\n",number.i);
getch();
}

[解决办法]
我用的是VS编译器,小端序
第一题:
union数据在内存的存放为:
内存号
n 10 0000 1100
n+1 1 0000 0001
由于是小端序,高位字节存储在高位,低位字节存储在低位。
因此union中i的值在内存中应该是以 (n+1 n)的序列存放,即 0000 0001 0000 1100
结果等于266

同理,第二题为
AB
6261
[解决办法]

union
{int i;
char x[2];
}a;
void main()
{
a.x[0] = 10;
a.x[1] = 1;
printf("%d",a.i);
}

输出 266(小端模式,内存中4个字节依次是 0x0A 0x01 0x00 0x00,对应int值为0x0000010A)即266

main()
{
union
{
int i;
struct
{
char first;
char second;
}half;
}
number;
number.i=0x4241;//0x42 对应字符'B'的ascii码,0x41对应字符'A'的ascii码。小端模式对应内存依次是 0x41 0x42 0x00 0x00
printf("%c%c\n",number.half.first,number.half.second);//打印前两个字节的char值
number.half.first ='a';//0x61
number.half.second ='b';//0x62
printf("%x\n",number.i);//此时内存中的值依次是 0x61 0x62 0x00 0x00。小端模式打印i的十六进制,即0x00006261,即0x6261
getch();
}

输出
AB
6261
[解决办法]
 
union{int i;char x[2];}a;void main(){a.x[0] = 10;a.x[1] = 1;printf("%d",a.i);}

//union总共4个字节:
地址: 0x0001: 10
0x0002: 01
0x0003: 00
0x0004: 00
所以小端的话:a.i为 0000 0000 0010 0001
大端的话:a.i为 0010 0001 0000 0000

[解决办法]
大小端跟体系结构是相关的
x86都是小端的
arm可以设置为大端 也可以为小端
[解决办法]
为么我觉得第一题有问题的?

union
{int i;
char x[2];
}a;

这个i可能是32位,后面16位可能没有初始化过。还是我脑子锈了?

出题的人都玩16位机吗?这里为么不用short?
------解决方案--------------------


引用:
为么我觉得第一题有问题的?

union
{int i;
char x[2];
}a;

这个i可能是32位,后面16位可能没有初始化过。还是我脑子锈了?

出题的人都玩16位机吗?这里为么不用short?

int 16位 或者 32位 在这里没影响的
他的a的定义为外部变量 初始化为全0
[解决办法]
引用:
小端的话:a.i为 0000 0000 0010 0001
大端的话:a.i为 0010 0001 0000 0000

小端的话 不应该是 :a.i为 0000 0000 0001 0010 吗

读书人网 >C语言

热点推荐