鱼C论坛

 找回密码
 立即注册
查看: 1616|回复: 3

[已解决]共用体

[复制链接]
发表于 2022-12-4 17:12:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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

  1. #include<stdio.h>
  2. int main()
  3. {
  4.         union intChars
  5.         {
  6.                 int ints[3];
  7.                 char chars[12];
  8.         }a;
  9.         a.ints[0]=8;
  10.         a.ints[1]=6;
  11.         a.ints[2]=4;
  12.         printf("%d\n",a.chars[4]);
  13.         return 0;
  14. }
复制代码

我的理解是共用体一共12个字节,int[0]占4个字节,给ints[0]=8,那么不应该是1000,chars[0]=0,chars[3]=1?
但是运行出来的跟我不一样
最佳答案
2022-12-4 18:00:23
本帖最后由 zhangjinxuan 于 2022-12-4 18:05 编辑
  1. #include<stdio.h>
  2. int main()
  3. {
  4.         union intChars
  5.         {
  6.                 int ints[3];
  7.                 char chars[12];
  8.         }a;
  9.         a.ints[0]=8;
  10.         a.ints[1]=6;
  11.         a.ints[2]=4;
  12.         for (int i = 0; i < 12; ++i)
  13.                 printf("%d ", a.chars[i]);
  14.         return 0;
  15. }
复制代码

程序输出:
  1. 8 0 0 0 6 0 0 0 4 0 0 0
复制代码

看看能不能领悟一点什么,其实上大部分计算机用小端存储,运用小端存储为让每个存放的变量“反转”,如果在大端存储的计算机中,那就是另一个结果了

大端
系统输出:
  1. 0 0 0 8 0 0 0 6 0 0 0 4
复制代码


因为你的系统是小端,所以 chars[4] 看到的就是这样:
  1. 01100000
复制代码

还因为是小端,什么东西读入赋值都得“反”着来,所以,正确的值应该是这个:
  1. 00000110
复制代码

也就是6,故程序输出6,或者直接看 8 0 0 0 6 0 0 0 4 0 0 0 这个结果也行

可能解释的不严谨,你可以看看这个:https://fishc.com.cn/forum.php?m ... hlight=%D0%A1%B6%CB
QQ图片20221204171522.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-12-4 17:49:17 | 显示全部楼层
也决定于操作系统,这个和操作系统有很大关系
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-4 18:00:23 | 显示全部楼层    本楼为最佳答案   
本帖最后由 zhangjinxuan 于 2022-12-4 18:05 编辑
  1. #include<stdio.h>
  2. int main()
  3. {
  4.         union intChars
  5.         {
  6.                 int ints[3];
  7.                 char chars[12];
  8.         }a;
  9.         a.ints[0]=8;
  10.         a.ints[1]=6;
  11.         a.ints[2]=4;
  12.         for (int i = 0; i < 12; ++i)
  13.                 printf("%d ", a.chars[i]);
  14.         return 0;
  15. }
复制代码

程序输出:
  1. 8 0 0 0 6 0 0 0 4 0 0 0
复制代码

看看能不能领悟一点什么,其实上大部分计算机用小端存储,运用小端存储为让每个存放的变量“反转”,如果在大端存储的计算机中,那就是另一个结果了

大端
系统输出:
  1. 0 0 0 8 0 0 0 6 0 0 0 4
复制代码


因为你的系统是小端,所以 chars[4] 看到的就是这样:
  1. 01100000
复制代码

还因为是小端,什么东西读入赋值都得“反”着来,所以,正确的值应该是这个:
  1. 00000110
复制代码

也就是6,故程序输出6,或者直接看 8 0 0 0 6 0 0 0 4 0 0 0 这个结果也行

可能解释的不严谨,你可以看看这个:https://fishc.com.cn/forum.php?m ... hlight=%D0%A1%B6%CB
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-6 10:02:27 | 显示全部楼层
本帖最后由 两手空空儿 于 2022-12-6 10:05 编辑

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

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

复制代码


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 01:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表