首页 > 试题广场 >

请问下列代码的输出结果有可能是哪些()?

[不定项选择题]
请问下列代码的输出结果有可能是哪些()?
#include <stdint.h>
#include <stdio.h>
union X {
    int32_t a;
    struct {
        int16_t b;
        int16_t c;
    };
};
int main() {
    X x;
    x.a = 0x20150810;
    printf("%x,%x\n", x.b, x.c);
    return 0;
}

  • 2015,810
  • 50810,201
  • 810,2015
  • 20150,810
0x20150810
如果按照大端模式存储:从低地址到高地址:20 15 08 10
                                  输出从低地址到高地址:20 15 08 10
如果按照小端模式存储:从低地址到高地址:10 08 15 20 
                                  输出从高地址到低地址:08 10 20 15
发表于 2016-04-03 00:21:12 回复(16)
0x20150810
如果按照大端模式存储:从低地址到高地址:20 15 08 10 ,so 结果就是 2015  810

如果按照小端模式存储:从低地址到高地址:10 08 15 20  ,so 结果就是 810 2015
不知道 我错在哪里,求指教
编辑于 2016-02-26 20:38:22 回复(9)
32bit宽的数0x12345678
在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:
                                          内存地址     0x4000     0x4001     0x4002     0x4003
                                          存放内容     0x78        0x56        0x34         0x12
而在Big- endian模式CPU内存中的存放方式则为:
                                          内存地址     0x4000     0x4001     0x4002     0x4003
                                          存放内容     0x12         0x34        0x56         0x78
发表于 2015-09-16 10:21:15 回复(1)
首先计算机是小端模式的,union是公用内存,int32_t内存大小4,int16_t内存大小2
所以内存从低到高是10 08 15 20,x.b和x.c各占一半,结果就是c
编辑于 2015-09-09 08:52:05 回复(4)

http://blog.csdn.net/huqinwei987/article/details/23597091
这个说得很详细
发表于 2015-09-14 15:28:54 回复(0)
0x20150810是十六进制数字 它的每一位都是一个十六进制数字,由4bits表示,所以两个数字占一个字节。这个数字刚好占4个字节。 输出的时候,机器不同,会有大端小端。就是从左存,还是从右存。 20 15 08 10 这个好理解。 10 08 15 20 主要是反着存的时候,输出的时候按两个字节来取,0810 2015,前面的零自动忽略。
发表于 2016-09-12 23:29:24 回复(0)
就没人和我一样不知道union是什么吗?
查了查资料,如下:

union介绍

共用体,也叫联合体,在一个“联合”内可以定义多种不同的数据类型, 一个被说明为该“联合”类型的变量中,允许装入该“联合”所定义的任何一种数据,这些数据共享同一段内存,以达到节省空间的目的。union变量所占用的内存长度等于最长的成员的内存长度。
举个例子
union test
{
     char mark;
     long num;
     float score;
};
sizeof(union test)的值为4。因为共用体将一个char类型的mark、一个long类型的num变量和一个float类型的score变量存放在同一个地址开始的内存单元中,而char类型和long类型所占的内存字节数是不一样的,但是在union中都是从同一个地址存放的,也就是使用的覆盖技术,这三个变量互相覆盖,而这种使几个不同的变量共占同一段内存的结构,称为“共用体”类型的结构。
因union中的所有成员起始地址都是一样的,所以&a.mark、&a.num和&a.score的值都是一样的。


发表于 2020-08-04 15:26:55 回复(1)
大端是高维在高地址,小端是低位在高地址
发表于 2020-05-26 15:44:54 回复(0)
0x20150810 如果按照大端模式存储:从低地址到高地址:20 15 08 10 ,so 结果就是 2015  810 如果按照小端模式存储:从低地址到高地址:10 08 15 20  ,so 结果就是 810 2015 大多数计算机都是小端
发表于 2017-09-01 11:32:46 回复(0)

联合体的存放顺序是所有成员都从低地址开始存放,利用该特性,可知测得是小端模式
编辑于 2017-06-28 19:55:29 回复(0)
多字节数据按怎样的顺序存放是跟CPu有关的,有正序(Big-Endian)和逆序(Little-Endian)之分。 Big-Endian:高位字节存入低地址,低位字节存入高地址,依次排列。 Little-Endian:低位字节存入低地址,高位字节存入高地址,依次排列。 常见的Intel体系芯片使用的编码方式属于Little-Endian类;某些RISC架构的CpU,如IBM的Powec-PC等属于Big-Endian类。
发表于 2017-02-27 00:39:37 回复(0)
大端存储和小端存储的区别,造成存在两种答案。
发表于 2017-01-29 14:26:01 回复(0)
为什么在输出的时候1008会转成0810?
发表于 2016-03-28 21:46:15 回复(3)
                    地址从左至右为:低->高
存放数据:
大端存储:20  15   08  10;
小端存储:10 08 15 20;
拿取数据:
大小端的2015 1008处是x.b的地址
大端x.b=2015;小端x.b=0810.为什么这样?
大端拿数据也是高地址15的数据是原始数据的低位,这样就理解答案了

发表于 2023-12-02 17:56:04 回复(0)
考察点:联合体(共用体)元素存储在相同的地址上 大小端字节序!
发表于 2023-09-01 09:21:48 回复(0)
请问为什么不是2015 0810呢?
发表于 2023-02-28 08:43:20 回复(0)

1.联合可以定义多个成员,多个成员共享一段内存大小是最大的成员的内存,该联合两个成员都是32


2.每次只能使用一个成员,对一个成员赋值会覆盖其他成员,题目中对int32成员赋值,那么就是对整段内存赋值


发表于 2020-02-21 23:08:05 回复(0)
我擦,没注意是多选题
发表于 2018-04-27 15:22:49 回复(0)
大端,高位低地址;小端,高位高地址
发表于 2018-03-11 12:17:39 回复(0)