鱼C论坛

 找回密码
 立即注册
查看: 2374|回复: 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的输出
#include<stdio.h>
int main()
{
        union intChars
        {
                int ints[3];
                char chars[12];
        }a;
        a.ints[0]=8;
        a.ints[1]=6;
        a.ints[2]=4;
        printf("%d\n",a.chars[4]);
        return 0;
}
我的理解是共用体一共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 编辑
#include<stdio.h>
int main()
{
        union intChars
        {
                int ints[3];
                char chars[12];
        }a;
        a.ints[0]=8;
        a.ints[1]=6;
        a.ints[2]=4;
        for (int i = 0; i < 12; ++i)
                printf("%d ", a.chars[i]);
        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[4] 看到的就是这样:
01100000
还因为是小端,什么东西读入赋值都得“反”着来,所以,正确的值应该是这个:
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 编辑
#include<stdio.h>
int main()
{
        union intChars
        {
                int ints[3];
                char chars[12];
        }a;
        a.ints[0]=8;
        a.ints[1]=6;
        a.ints[2]=4;
        for (int i = 0; i < 12; ++i)
                printf("%d ", a.chars[i]);
        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[4] 看到的就是这样:
01100000
还因为是小端,什么东西读入赋值都得“反”着来,所以,正确的值应该是这个:
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个字节里了。
咱们常用的电脑是小端,就是低位放低地址
ints[3] = { 8, 6, 4 };在内存中的存放如下(16进制)
   ints[3]     08 00 00 00 06 00 00 00 04 00 00 00
chars[12]下标: 0  1  2  3  4  5  6  7  8  9  10  11
printf("%d\n",a.chars[4]);     这一句拿到的数据就应该是6
chars[0] = 8, chars[3] = 0

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-17 13:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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