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

中兴公司技能等级考试一道题,求,求帮忙分析上,多谢,着通过考试,要补考,求耐心剖析上

2013-01-18 
中兴公司技能等级考试一道题,急求,求帮忙分析下,谢谢,急着通过考试,要补考,求耐心剖析下#include stdio.h

中兴公司技能等级考试一道题,急求,求帮忙分析下,谢谢,急着通过考试,要补考,求耐心剖析下
#include <stdio.h>
void main()
{
     int i;
     char un[100];
     short c;
     for(i=0;i<100;i++)
     {
         un[i]=1;
     }
     c=*(short*)((int*)un+2);
     printf("%d %d %d\n",c,sizeof(int),sizeof(short));
}

问题1,输出结果并分析过程
问题2,这个和大小端是否有关系,若有,说明理由和结果,若无,说明理由
[解决办法]
个人理解,如有不当之处,请楼下大神纠正

c=*(short*)((int*)un+2);
printf("%d %d %d\n",c,sizeof(int),sizeof(short));

主要是这两句
1.(int*)un+2表示的是指向un[8]~un[11]地址的指针(因为int值占四个字节,所以它指向四个字节地址的低位)
(short*)((int*)un+2)则指向两个字节地址的低位,即un[8]、un[9]的地址
*(short*)((int*)un+2)即这个地址低两位的内容即un[8]、un[9]
un[8]~un[11]的值是
0x01010101
如果是大端模式,则低2个字节存的是0x0101,即257
如果是小端模式,则低2个字节存的也是0x0101,即257
所以c的值是257,而sizeof(int),sizeof(short)分别是4和2
所以输出结果是257 4 2
和大端小端有关系,因为如果char数组的每个元素都不一样的话,大端和小端输出结果就不同了
[解决办法]
此题大端小端不影响输出结果
[解决办法]
首先内存是0x01填充的,所以结果和大小端无关。结果为0x0101, 4, 2
也就是 257 4 2

[解决办法]
引用:
引用:
此题大端小端不影响输出结果
如果修改下题目,改为0x12填充呢

0x12是2个字节了。
这个题是用字符(单字节)填充的,而且每个字节都一样,所以对这个题没有影响。

如果撇开这道题目,每个字节都用不同内容填充的话,肯定会受影响的。
[解决办法]
引用:
引用:
引用:
此题大端小端不影响输出结果
如果修改下题目,改为0x12填充呢
0x12是2个字节了。
这个题是用字符(单字节)填充的,而且每个字节都一样,所以对这个题没有影响。

如果撇开这道题目,每个字节都用不同内容填充的话,肯定会受影响的。

sorry,我错了,0x12也是一个字节,没有影响。。
[解决办法]
引用:
引用:个人理解,如有不当之处,请楼下大神纠正


C/C++ code
?



12

c=*(short*)((int*)un+2); printf("%d %d %d\n",c,sizeof(int),sizeof(short));
主要是这两句
1.(int*)un+2表示的是指向un[8]~un[11]地……

把for循环的赋值方法改掉,比如
 for(i=0;i<100;i++)
     {
         un[i]=1+i;
     }
每个byte的值不一样,那么不同的排列顺序就会变成不同的输出

[解决办法]
#include <stdio.h>
void main()
{
     int i;
     char un[100];
     short c;
     for(i=0;i<100;i++)
     {
         un[i]=i;//比如如果把这里1改成i
     }
     c=*(short*)((int*)un+2);
     printf("%d %d %d\n",c,sizeof(int),sizeof(short));
}

这时候
*((int*)un+2)的值就是:
0x08090A0B
如果是大端模式,*(short*)((int*)un+2)的值就是:
0x0809 即2057
如果是小端模式,*(short*)((int*)un+2)的值就是:
0x0908 即2312

[解决办法]
ZTE待过的飘过。。。
[解决办法]

分析如下,如果有错,请大神批评:
每个short元素的值是0x 00 01
所以大端机器的数组内存表示是  00010001 00010001 00010001.....
    小端机器的数组内存表示是  01000100 01000100 01000100.....
大端机器中int数据内存表示是   00010001 00010001对应的数值是0x 00010001 00010001
小端机器中int数据内存表示是   01000100 01000100对应的数值是0x 00010001 00010001
所以哪怕short元素的值是0x 12 34 ,这一题中的int值也不会因大端小端而改变。
因为小端内存中 34 12 34 12对应的数值还是0x 12 34 12 34.
当然,这一切的前提是sizeof(int)的值是sizeof(short)的值的2^n倍,n=0,1,2,3...。
所以要吐槽一下,对于题目问sizeof(int)的值为多少真的很无奈,知道它依赖于平台,但你还不得不写4。
[解决办法]

引用:
C/C++ code
?



12345678910111213

#include <stdio.h> void main() {      int i;      char un[100];      short c;      for(i=0;i<100;i++)      {          un[i]=i;//比如如果把这里1改成i      }      c=*(sh……

我这里表述有误
我是想说((int*)un+2)所指的四字节地址的内容
0x08 0x09 0x0A 0x0B
因为*((int*)un+2)的值跟大端小端有关
大端:0x08090A0B
小端:0x0B0A0908
[解决办法]
引用:
分析如下,如果有错,请大神批评:
每个short元素的值是0x 00 01
所以大端机器的数组内存表示是  00010001 00010001 00010001.....
    小端机器的数组内存表示是  01000100 01000100 01000100.....
大端机器中int数据内存表示是   00010001 00010001对应的数值是0x 00010001 0001000……

sorry,更新一下:
分析如下,如果有错,请大神批评:
每个short元素的值是0x 00 01
所以大端机器的数组内存表示是  0001 0001 0001 0001 0001 0001.....
    小端机器的数组内存表示是  0100 0100 0100 0100 0100 0100.....
大端机器中int数据内存表示是   00010001对应的数值是0x 00010001
小端机器中int数据内存表示是   01000100对应的数值是0x 00010001
所以哪怕short元素的值是0x 12 34 ,这一题中的int值也不会因大端小端而改变。
因为小端内存中 34 12 34 12对应的数值还是0x 12 34 12 34.
当然,这一切的前提是sizeof(int)的值是sizeof(short)的值的2^n倍,n=0,1,2,3...。
所以要吐槽一下,对于题目问sizeof(int)的值为多少真的很无奈,知道它依赖于平台,但你不得不写4。
[解决办法]
引用:
引用:
分析如下,如果有错,请大神批评:
每个short元素的值是0x 00 01
所以大端机器的数组内存表示是  00010001 00010001 00010001.....
    小端机器的数组内存表示是  01000100 01000100 01000100.....
大端机器中int数据内存表示是   00010001 00010……

你说的没错。
但是注意这个题里面un是char数组,不是short数组。
[解决办法]
引用:
引用:
分析如下,如果有错,请大神批评:
每个short元素的值是0x 00 01
所以大端机器的数组内存表示是  00010001 00010001 00010001.....
    小端机器的数组内存表示是  01000100 01000100 01000100.....
大端机器中int数据内存表示是   00010001 00010……

我靠,看错了,以为数组是short数组。原来是char数据,这样就更不用担心大小端了。
------解决方案--------------------


引用:
个人理解,如有不当之处,请楼下大神纠正


C/C++ code
?



12

c=*(short*)((int*)un+2); printf("%d %d %d\n",c,sizeof(int),sizeof(short));
主要是这两句
1.(int*)un+2表示的是指向un[8]~un[11]地址的指针(因为int值占四个字节,所以它指向四个字节地址的低位)
……


1楼正解,大小端值相同主要在于un[i]=1;赋值后每个字节都是01,所以大小端存储后0x0101意义不一样但值相同

热点排行