首页 > 试题广场 >

参考以下代码,在大端字节机器中x.c的值为union A

[单选题]
参考以下代码,在大端字节机器中x.c的值为
union A {
    short c;
    char buf[4];
} x = {0x01, 0x02, 0x03, 0x04}


  • 0x102
  • 0x201
  • 0x304
  • 0x403
所谓大端就是指高位值在内存中放低位地址,所谓小端是指低位值在内存中放低位地址。
比如0x11223344在大端机上是11223344,在小端机上是44332211。
发表于 2018-09-12 10:34:21 回复(1)
测试了一下,这个程序的初始化有点问题,其实x中实际存储的值是01,后面的三个值都被丢弃掉了。如果按照题目的本意x中的存储内容从低地址到高地址为01020304,如果将这个联合体解释为short类型,由于short类型占两个字节的存储空间,那么联合体的最低两个字节有效,也就是0102。又因为是大端存储,低地址占据最高有效位,所以实际的十六进制值为:0102。
我们在书写的时候,对于地址,一般是低地址在左,高地址在右;而对于各种进制的数值,确是最高有效位在左,最低有效位在右,这是在理解大小端问题时我们需要注意的地方。
发表于 2019-01-10 08:36:09 回复(0)
char buf[4];是一个字节数组,也就是每个元素只占一个字节,字节元素不存在大小端问题,所以答案A才符合。
发表于 2018-09-18 00:47:10 回复(0)
大端字节:高位值放在内存中的低位地址 ; 小端字节:低位值放在内存中的低位地址。
union联合,结构中的数据共享空间。
题目中字符数组在内存中的存放:                        c在内存中的存放(和buf共享空间):
A:       0x01     ----->低位地址                                 0x01
A+1:0x02                                                             0x02 
A+2:   0x03                                                             由于是大端字节,所以 A+1存放的是低位值,A存放的是高位值,所以c位0x0102,即选A。
A+3:   0x04     ------>高位地址
发表于 2018-09-18 09:09:14 回复(0)
在大端字节机器中,多字节数据的高字节保存在低地址,低字节保存在高地址。在这个例子中,union A中的成员变量c和buf共享同一块内存空间。
short 占两个字节,联合体占4个字节共享空间
按照大端字节序,内存布局如下:

地址    | 内容
--------|--------
0x1000  | 0x01
0x1001  | 0x02
0x1002  | 0x03
0x1003  | 0x04

因此,x.c的值为0x0102。
发表于 2023-09-26 09:44:58 回复(0)
最高位的0是不是省略了没写出来啊
发表于 2018-09-07 14:00:25 回复(3)
1. 首先明确大端字节序和小端字节序的概念: - 大端字节序(Big-Endian):高位字节存于内存低地址,低位字节存于内存高地址。 - 小端字节序(Little-Endian):低位字节存于内存低地址,高位字节存于内存高地址。 2. 对于给定的联合体 union A : - 联合体中的成员共享同一块内存空间。 - 这里 x 被初始化为 {0x01, 0x02, 0x03, 0x04} ,因为是大端字节序,所以内存中存储顺序为 0x01 (低地址), 0x02 , 0x03 , 0x04 (高地址)。 - 当访问 x.c 时, short 类型占2个字节,在大端字节序下,取低地址的2个字节,即 0x01 和 0x02 ,并且高位字节 0x01 在低地址,低位字节 0x02 在高地址,所以 x.c 的值为 0x0102 (十六进制表示),也就是 0x102 (题目中这种简略表示形式)。 答案是A。 以下是对这段代码的解释: 1.  union (联合体)的概念: - 联合体是一种特殊的数据类型,它允许在相同的内存位置存储不同的数据类型。在这个例子中,定义了一个联合体 A 。 2. 联合体 A 的成员: - 它有两个成员,一个是 short 类型的 c , short 通常在大多数系统中占2个字节。 - 另一个是 char 类型的数组 buf ,数组大小为4, char 类型通常占1个字节,所以这个数组占4个字节的内存空间。 3. 变量 x 的定义和初始化: - 定义了一个联合体 A 类型的变量 x 。 - 并对它进行初始化,初始值为 {0x01, 0x02, 0x03, 0x04} 。这里要注意,由于联合体成员共享同一块内存空间,初始化的值会按照成员在内存中的存储顺序来填充。在这种情况下,因为 char 数组是按顺序存储的,所以 buf[0] 的值为 0x01 , buf[1] 的值为 0x02 , buf[2] 的值为 0x03 , buf[3] 的值为 0x04 。同时,由于 short 类型的 c 也共享这块内存,它的值会根据字节序(大端或小端)来确定,在不同字节序下访问 c 会得到不同的值。
编辑于 2024-10-25 08:34:03 回复(0)
大端存储是0x102 小段存储是0x201 吗?
发表于 2024-01-23 11:38:30 回复(0)
大伙注意, 如果是小端字节序,不是0x0304,而是0x0201
发表于 2023-06-13 11:43:34 回复(1)
弱弱的问,编译报错? (error C2078: 初始值设定项太多)
发表于 2018-10-25 15:02:05 回复(0)
应该是0x0102吧,感觉0省略了
发表于 2018-10-02 11:03:31 回复(0)