关于c语言共用体的问题

大哥哪位知道,关于c语言共用体的问题
最新回答
饮醉

2025-03-02 06:19:34

int型的变量 占2个字节,而一个内存单元只有一个字节的大小,因此int型变量要分开放。


那怎么放呢?是这样的,先把int变量分成两个字节,前八位作为高字节,后八位作为低字节,这样,把高字节的那八位放在低地址内存单元,低字节的那八位放在高地址内存单元。

而long型的占四个字节,也是一样的,分成四个字节分开放,高字节放低地址内存单元。


你的程序中,只占一个字节的0x39给了int型的i[0],那这样,高字节为0,假设放在最低地址的内存单元中,那0x39就顺着往上放,i[1]也一样。好了,这样放完后,这个占四个字节的共用体变量的存储情况就是:0x38 / 0x00 / 0x39 / 0x00 (说明:左手边为高地址,右手边为低地址)。

                       i[1]                  i[0]

好了,我们现在是取long型的k,那很显然,低地址的存储单元是它的高字节,高地址的存储单元是它的低字节,这样就得到:0x 00 39 00 38 。

  

这是我用keil-C51仿真得到的结果,如果你问为什么结果跟你的不一样,那我只能回答:系统决定变量的存放方式。

现实扎人心

2025-03-02 06:45:40

共同体(联合体)的特点是所有成员变量共享同一块内存单元。
另外
(1)当各成员长度不相等 时,内存块的大小由 最长的决定。-- 你的几个成员长度相等,无此问题。
(2)数据存放时涉及字节次序,分大端序和小端序。WINDOWS 用小端序。

小端序:
i[2] 的 排列 是 i[0] 2字节,i[1] 下面的2字节
i[0] 里2个字节 低字节在前,高字节在后 0x0039 排列成 0x39 0x00
i[1] 里2个字节 低字节在前,高字节在后 0x0038 排列成 0x38 0x00
于是4个字节内容 是 0x39 0x00 0x38 0x00
翻译成 long int k:
k 的4字节 排列 是:最低字节,低字节,高字节,最高字节 (0x39 0x00 0x38 0x00)
输出数据时要拼成:最高字节 高字节 低字节 最低字节 也就是 0x00 0x38 0x00 0x39
输出为 0x00380039 (输出格式 0x%08x)
或 380039 (输出格式 %x)

大端序从略。
就是这个范儿╮

2025-03-02 08:58:33

共用体是构造数据类型,也叫联合体
它使几个不同类型的变量共占一段内存(相互覆盖),每次只有一个能使用.

结构体则不然, 每个成员都会有存储空间的,可以一起用.

32位操作系统下 short int占2字节,int占4字节,38=1个字节, 00=2个字节,39=1个字节;
为什么先输出38然后39呢,因为数据储存在遵循了 先进后出原则,这涉及到共用体类型数据的存储。这里不能长篇大论了。
所以呢,s->k读取的是 数组i[2]地址的数据
追问
请问i[2]种存储的二进制数据是什么?怎么算的?
追答
%x是16进制,printf("%x\n",s->k);也是以16进制输出
追问
可是,380039是怎么得出来的,我还是不知道啊
追答
第一次的回答完善了一下,回头看下哈,具体的那个中间的00,我再去研究下,别误导了你,。。
绝处逢生

2025-03-02 01:57:37

度娘不知道哪里抽了

别闹~

2025-03-02 00:09:48

16进制39,38化成二进制就是111001和111000
因为short int 2字节就是16位,所以两个都要在前面补0,每个都要够16位
得到0000000000111001和0000000000111000
连起来就是00000000001110010000000000111000
然后你会发现这就是16进制的380039