共用体
本帖最后由 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?
但是运行出来的跟我不一样 也决定于操作系统,这个和操作系统有很大关系{:10_282:} 本帖最后由 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: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]