h-b-z-d-j-s-m 发表于 2022-12-4 17:12:35

共用体

本帖最后由 h-b-z-d-j-s-m 于 2022-12-4 17:15 编辑

union intChars
        {
                int ints;
                char chars;
        }a;
对ints赋值,给出char的%d输出,求chars的%s的输出

#include<stdio.h>
int main()
{
        union intChars
        {
                int ints;
                char chars;
        }a;
        a.ints=8;
        a.ints=6;
        a.ints=4;
        printf("%d\n",a.chars);
        return 0;
}
我的理解是共用体一共12个字节,int占4个字节,给ints=8,那么不应该是1000,chars=0,chars=1?
但是运行出来的跟我不一样

zhangjinxuan 发表于 2022-12-4 17:49:17

也决定于操作系统,这个和操作系统有很大关系{:10_282:}

zhangjinxuan 发表于 2022-12-4 18:00:23

本帖最后由 zhangjinxuan 于 2022-12-4 18:05 编辑

#include<stdio.h>
int main()
{
      union intChars
      {
                int ints;
                char chars;
      }a;
      a.ints=8;
      a.ints=6;
      a.ints=4;
      for (int i = 0; i < 12; ++i)
              printf("%d ", a.chars);
      return 0;
}
程序输出:
8 0 0 0 6 0 0 0 4 0 0 0
看看能不能领悟一点什么,其实上大部分计算机用小端存储,运用小端存储为让每个存放的变量“反转”,如果在大端存储的计算机中,那就是另一个结果了

大端系统输出:
0 0 0 8 0 0 0 6 0 0 0 4

因为你的系统是小端,所以 chars 看到的就是这样:
01100000
还因为是小端,什么东西读入赋值都得“反”着来,所以,正确的值应该是这个:
00000110
也就是6,故程序输出6,或者直接看 8 0 0 0 6 0 0 0 4 0 0 0 这个结果也行

可能解释的不严谨,你可以看看这个:https://fishc.com.cn/forum.php?mod=viewthread&tid=75394&highlight=%D0%A1%B6%CB

两手空空儿 发表于 2022-12-6 10:02:27

本帖最后由 两手空空儿 于 2022-12-6 10:05 编辑

楼主清注意你画的图有问题,ints是占用4个字节,你算出来的1000是一个字节的数据,你把它拆开放在了4个字节里了。

咱们常用的电脑是小端,就是低位放低地址
ints = { 8, 6, 4 };在内存中的存放如下(16进制)
   ints   08 00 00 00 06 00 00 00 04 00 00 00
chars下标: 01234567891011
printf("%d\n",a.chars);   这一句拿到的数据就应该是6
chars = 8, chars = 0



页: [1]
查看完整版本: 共用体