首页 > 试题广场 >

在32位小端的机器上,如下代码输出是什么?

[单选题]
在32位小端的机器上,如下代码输出是什么:
char array[12] = {0x01 , 0x02 , 0x03 , 0x04 , 0x05 , 0x06 , 0x07 , 0x08};     
 short *pshort = (short *)array;     
 int *pint = (int *)array;     
 int64 *pint64 = (int64 *)array;     
 printf("0x%x , 0x%x , 0x%llx , 0x%llx", *pshort , *(pshort+2) , *pint64 , *(pint+2));

  • 0x201 , 0x403 , 0x807060504030201 , 0x0
  • 0x201 , 0x605 , 0x807060504030201 , 0x0
  • 0x201 , 0x605 , 0x4030201 , 0x8070605
  • 0x102 , 0x506 , 0x102030405060708 , 0x0
B。
小端机器的数据高位字节放在高地址,低位字节放在低地址。
char array[12] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
1,char一字节,直观呈现的结果为:0x08-07-06-05-04-03-02-01(从后到前下标为0-7)
2,short两字节,直观呈现 的结果 为: 0x0807-0605-0403-0201 (从后到前 下标 为0-3)
*pshort从0开始,所以0x201;
*(pshort+2)从2开始,所以0x605;
3,int64八字节,直观呈现 的结果 0x0807060504030201 (从后到前 下标 为0)
*pint64从0开始,所以0x807060504030201;
4,int四字节,直观呈现为0x08070605-04030201(从后到前 下标 为0-1)
*(pint+2))从2开始,但是最多只到下标1,后面位置默认为0。
编辑于 2016-05-18 17:58:50 回复(13)
小端机器的数据高位字节放在高地址,低位字节放在低地址。x86结构为小端模式。
pshort占用2个字节,在内存中的16进制为0x01 0x02,对应的16进制数为0x0201。
pshort + 2指向array数组的下标为4的元素,占用2个字节,在内存中的16进制为0x05 0x06,对应的16进制数为0x0605。
pint64的int64类型不确定,但根据名字可以看出占用8个字节,对应的16进制形式为0x807060504030201。
pint  + 2占用4个字节,指向的array数组的下标为8的元素,8-11个元素没有指定数组的初始化值,默认为0,因此*(pint + 2)对应的16进制为0

选B
编辑于 2015-08-22 14:49:02 回复(8)
[5.22添加]在我测试的系统上,printf %x 是不能输出 64 位的值的,我想了解下用 %x 输出64位值的同学你们是在哪个环境下测试的?

你们的 printf 可以输出64位的值么?
这个 printf 在 gcc 4.8 下是编译不过的。

在 vc 下面没有判断 printf 对应的参数类型,压入 pint64 时入栈 8 个字节,printf 的第3个 %x 显示 pint64 的低32位,第四个 %x 显示 pint64 的高32位,(pint+2)压入栈的数值没有被 printf 抓到。

答案是C。


Microsoft (R) C/C++ Optimizing Compiler Version 17.00.61030 for x86
D:\work\test\dump>foo2
0x201 , 0x605 , 0x4030201 , 0x8070605

gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)
foo.cpp: In function ‘int main()’:
foo.cpp:9:81: warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 4 has type ‘long long int’ [-Wformat=]
printf("0x%x , 0x%x , 0x%x , 0x%x", *pshort , *(pshort+2) , *pint64 , *(pint+2));

0x201 , 0x605 , 0x4030201 , 0x0

编辑于 2015-08-23 04:39:29 回复(7)
小端模式:低位编址(低位字节放在低地址,高位字节放在高地址)
大端模式:高位编址(高位字节放在低地址,低位字节放在高地址)
我个人理解是这样的:不管是大段模式还是小端模式都只是针对于一个基本的数据类型,比如一个short型,int型等,而不针对与数组这样的数据类型。
对于此题来说:该数组是存放在堆栈里,堆栈是向下生长,而数组不管在什么数据结构中,都是向上生长的。即这个数组的整体元素地址是向上的(array[0]---->array[11] 是从低地址---->高地址)。
对于单个元素来看:array[0]是为一个字节,所以不用考虑它的编址方式(编址是针对于多个字节的数据来说)。
所以这个数据表现为0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08(低地址---->高地址)。

pshort占用2个字节,且pshort = (short*)array; 在内存中的16进制为0x01(低地址) 0x02(高地址),因为是小端编址, 对应的16进制数为0x0201。
以下以此类推。
发表于 2020-10-21 10:45:07 回复(0)
        小端存储(Little Endian)。 字节 半字节 的最低位字节(Lowest Significant Bit,LSB)存放于内存最低位字节地址上。
        即最低地址存放的最低 字节 ,一个用十六进制表示的32位数据:12345678H,存放在 存储字长 是32位的 存储单元 中,按低字节到高字节的存储顺序为0x78、0x56、0x34和0x12。整个 存储字 从低字节到高字节读出的结果就是:78563412H,为Intel x86 系列等采用。
        Int64是有符号 64 位整数数据类型,相当于C++中的long long、 C# 中的 long 和 SQL Server 中的 bigint,表示值介于 -2^63 ( -9,223,372,036,854,775,808) 到2^63-1(+9,223,372,036,854,775,807 )之间的整数。存储空间占 8 字节。用于整数值可能超过 int 数据类型支持范围的情况。
        对于chararray[12] = {0x01, 0x02, 0x03 ... 0x06, 0x07, 0x08}; 按照低字节到高字节的存储顺序为0x08,0x07,...,0x02,0x01。
以下来自@ Pandora
        小端机器的数据高位字节放在高地址,低位字节放在低地址。
       char array[12] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}; 
       1,char一字节,直观呈现的结果为:0x08-07-06-05-04-03-02-01(从后到前下标为0-7)
       2,short两字节,直观呈现 的结果 为: 0x0807-0605-0403-0201 (从后到前 下标 为0-3) :
            *pshort从0开始,所以0x201;
            *(pshort+2)从2开始,所以0x605;
       3,int64八字节,直观呈现 的结果 为 0x0807060504030201 (从后到前 下标 为0) :
           *pint64从0开始,所以0x807060504030201;
       4,int四字节,直观呈现为0x08070605-04030201(从后到前 下标 为0-1) :
           *(pint+2))从2开始,但是最多只到下标1,后面位置默认为0。
     

编辑于 2017-06-13 20:45:00 回复(0)
大小端是以数据高低位字节存放的顺序来定义的;当然,存放时,都是先从内存的低地址开始存的。
发表于 2015-09-04 19:15:41 回复(1)
正确答案:C
发表于 2014-12-29 17:00:02 回复(3)
虽然大部分情况栈的生长方向自上向下,但是数组的方向都是向上生长的;小端存储,高字节放高地址,低字节放低地址;大段存储相反
发表于 2017-07-07 16:33:03 回复(1)
最后一个为什么是0x0
发表于 2021-12-18 11:29:41 回复(2)
大小端储存相关概念:
http://t.csdn.cn/apsGg
发表于 2023-08-16 11:11:48 回复(0)
有无大佬说一下这题如果是大端,答案是什么
发表于 2023-06-23 08:53:38 回复(0)
说点自己的理解
小端模式:低地址存放低字节数据,高地址存放高字节数据
头开始数组为char类型,每个字符类型占一个数据
01|02|03|04|05|06|07|08
将数组名转为short*类型赋值给pshort,注意:上面的数据始终是这样存储在内存单元中
short数据占2字节,第一个short数据中是01|02,01是低地址,02是高地址
根据小端模式,第一个short数据应为0x0201
············以下同上分析。

编辑于 2021-03-18 22:29:39 回复(0)
int64八字节易错点
发表于 2021-01-21 14:10:12 回复(0)
<p>指针长度是short</p>
发表于 2020-12-07 14:52:03 回复(0)
高高低低是小端,高低低高是大端
发表于 2019-11-24 07:32:05 回复(0)
虽然选B
但是printf的格式还是有问题
应该printf("0x%x, 0x%x, 0x%llx, 0x%x", *pshort, *(pshort + 2), *pll, *(pint + 2));
发表于 2019-11-07 18:03:36 回复(0)
首先小端机是数据的小位放在小地址上,简单可以记忆为小小小😁我是这么记的 小端机存储的话,首先是char一字节,那么存储就是这样的:08 07 06 05 04 03 02 01 short类型存储两字节就是这样的:0807 0605 0403 0201 int类型储存四字节是这样的:08070605 04030201 int64储存八字节是这样的:0807060504030201 ①那么第一个*pshort是从0开始的,也就是数组第一个元素,所以就是0201(输出会把0省略) ②第二个*(pshort+2)就是数组第三个元素,所以就是0605(输出会把0省略) ③第三个*pint64直接就输出了0807060504030201 ④第四个*(pint+2),pint只有两个元素,*(pint+2) 是数组的第三个元素,这个时候超出范围了,所以输出0
发表于 2019-03-20 10:19:37 回复(2)
发表于 2018-06-14 18:44:55 回复(0)
char array[12] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};     
 short* pshort = (short*)array;    
 int*pint = (int*)array;     
 int64 *pint64 = (int64 *)array;     
 printf("0x%x , 0x%x , 0x%llx , 0x%llx", *pshort , *(pshort+2) , *pint64 , *(pint+2));
pshort为0x0201 pshort+2为 0x0605 pin64为0x0807060504030201  pint+2为array[8]的地址,所以为0
注意0xXXXX 人类书写都是按照高位在前的顺序。所以这点别搞混了
发表于 2018-06-02 22:36:47 回复(0)
记忆口诀:大端和字符串的保持方式一样。低地址存放高位
发表于 2018-04-10 23:04:00 回复(0)