首页 > 试题广场 >

下面程序运行后,输出的结果是()

[单选题]
下面程序运行后,输出的结果是()
#include "stdio.h"

int main() {
    union {
        char c;
        int i;
    } u;
    u.c = 'A';
    u.i = 0x0143;
    printf("%d,%d", u.c, u.i);
}
  • 65,323
  • 67,323
  • 65,65
  • 323,323
推荐
选B
union共用体是一种特殊的数据类型,允许在相同的内存位置存储不同的数据类型,同一时间只用到一个成员
所以共用体的C成员的值有损坏,因为最后赋给变量的i值占用了内存位置,所以十六进制转换十进制结果为:323。而int类型i的后八位(01000011)转化十进制为67取代原来的A(01000001).
编辑于 2019-03-25 14:44:01 回复(1)
选B
【分析】
本题考查的是union联合体的存储特性

union中的成员变量是不共存的,所有成员变量的起始地址相对于union基地址偏移量都是0,即union创建时分配的内存空间,所有的成员变量共用,新值会覆盖旧值
所以经过 “u.c='A';  u.i=0×0143; ” 两次赋值后,u中存储的实际是16进制数143的值,即1 0010 0011。读取char型u.c的值会返回该内存空间的后8位即0010 0011转换为10进制数就是67,而u.i的值就是1 0010 0011即323


发表于 2019-03-23 14:22:29 回复(1)
union共用体是一种特殊的数据类型,允许在相同的内存位置存储不同的数据类型,同一时间只用到一个成员
在本题的代码中,u.c='A' ,此时应该为65(对应的二进制为100 0001);
                             之后,u.i=0x0143,此时应该为323(对应的二进制为 1 0100 0011)
注意,u.i被赋值之后原本的 100 0001 变成了 100 0011 ,因此u.c此时应该是67
发表于 2021-12-24 21:04:02 回复(1)
要看清这是个联合体,不然就傻傻的去算了,联合体的大小是内部数据最大的字节数,所以是int类型,如果题目没说明那么就是小端存储,成员c被赋值成a的低两位,0x43十进制就是67🤨
发表于 2021-08-24 16:54:57 回复(0)
选B
u.i是323的十六进制表示,但u.c只是u.i二进制表示的后8位(int型占32位,char型8位)
(143)=(0000000101000011)取后8位即67。
其中使用union会使每次共用一个内存首地址,参考如下代码,所以u.c和u.i都会从u.i的值开始读

发表于 2019-03-22 18:25:11 回复(0)
小端地址?
发表于 2020-11-14 14:44:52 回复(1)

选B

发表于 2019-03-22 17:19:12 回复(0)
union中的成员变量是不共存的,所有成员变量的起始地址相对于union基地址偏移量都是0,即union创建时分配的内存空间,所有的成员变量共用,新值会覆盖旧值
所以经过 “u.c='A';  u.i=0×0143; ” 两次赋值后,u中存储的实际是16进制数143的值,即1 0010 0011。读取char型u.c的值会返回该内存空间的后8位即0010 0011转换为10进制数就是67,而u.i的值就是1 0010 0011即323
union共用体共用空间,空间存储的二进制代码是最后一次赋值的值
发表于 2023-03-09 13:56:40 回复(1)
union共用体共用空间,空间存储的二进制代码是最后一次赋值的值
发表于 2021-03-17 21:12:59 回复(0)
B
发表于 2023-03-11 20:07:21 回复(0)
从低位开始看
发表于 2022-03-11 17:31:05 回复(0)