C语言共用体中,共用体变量的规律

运行以下代码,看一看输出的结果是什么?

#include <stdio.h>
int main(){
	union key{
		int k;
		char ch[2];
	}u;
	u.k = 258;
	printf("%d %d\n",u.ch[0],u.ch[1]);
	return 0;
}

运行结果:
请添加图片描述
从运行的结果中可以看出,ch[0]的值为2,ch[1]的值为1。为什么呢?
共用体的特点为:共用体可以将不同数据类型的值放在同一个内存空间中,现实在一个存储区根据程序执行的不同需求读写不同类型的数据。所有成员共用一块内存空间,其首地址相同。共用体变量与其各成员变量的内存地址相同。共用体变量所占内存大小为成员当中占内存最大的那个变量的大小。

给u.k赋值为258,ch[0]的值为2,ch[1]的值为1。为了找出其规律,可以多试几个数:

#include <stdio.h>
int main(){
        union key{
                int k;
                char ch[2];
        }u;
        printf("%d\n",sizeof(u));    //输出u所占的字节数
        int i = 0;
        while(1){
                scanf("%d",&u.k);
                printf("%d %d\n",u.ch[0],u.ch[1]);
                i++;
                if(i==100){
                        break;
                }
        }
     	return 0;
}

运行:
请添加图片描述
u所占的字节数为4,也就是成员中占字节数最大的int的字节数。4个字节32位。根据以上输入输出结果,列出对应数字的二进制:

第一个输入为0,int类型,二进制为:0000 0000 0000 0000 0000 0000 0000 0000
char类型占1个字节,其对应该二进制数的后八位,所以char的值为0。而char[1]对应该二进制数的倒数第二个后八位,所以ch[1]的值也为0.

第二个输入为1,二进制数为:0000 0000 0000 0000 0000 0000 0000 0001,根据前面的对应结果,ch[0]的值为1,ch[1]的值为0.

直到输入127,对应的二进制数为:0000 0000 0000 0000 0000 0000 0111 1111,ch[0]的值为127,ch[1]的值为0

输入128,对应的二进制数为:0000 0000 0000 0000 0000 0000 1000 0000,ch[0]的值为-128,因为char的存储数值范围在-128~127,1000 0000最高为符号位为1,所以这个数为负数,减1得到反码为0111 1111,再取反得到数值1000 0000,所以为-128。而ch[1]的值为0.

输入129,对应的二进制数为:0000 0000 0000 0000 0000 0000 1000 0001,ch[0]的值为-127,其二进制为1000 0001,最高位为1,所以为负数。减1得到反码为1000 0000,取反得到数值为0111 1111,所以ch[0]的值为-127。ch[1]的值依旧为0.

输入255,对应的二进制数为:0000 0000 0000 0000 0000 0000 1111 1111,ch[0]的值为-1,其二进制为1111 1111,最高位为1,所以为负数。减1得到反码为1111 1110,取反得到数值为0000 0001,所以ch[0]的值为-1。ch[1]的值此时依旧为0.

输入256,对应的二进制数为:0000 0000 0000 0000 0000 0001 0000 0000,此时后八位的数值为0,所以ch[0]的值为0. 倒数第二个后八位为0000 0001,也就是ch[1]的数值,为1.

输入257,对应的二进制数为:0000 0000 0000 0000 0000 0001 0000 0001,后八位0000 0001为ch[0]的数值,为1. 倒数第二个后八位ch[1]的值也为1.

… …


由此就可以得到共用体变量的数值规律。

修改代码,如下:

#include <stdio.h>
int main(){
        union key{
                int k;
                char ch[4];
        }u;
        printf("%d\n",sizeof(u));
        int i = 0;
        while(1){
                scanf("%d",&u.k);
                printf("%d %d %d %d\n",u.ch[0],u.ch[1],u.ch[2],u.ch[3]);
                i++;
                if(i==100){
                        break;
                }
        }
        return 0;
}

如果输入34752536,对应的二进制数为:0000 0010 0001 0010 0100 1000 0001 1000,那么就可以得到ch[0]的值为24,ch[1]的值为72,ch[2]的值为18,ch[3]的值为2。那么运行一下检验结果:
请添加图片描述
由结果可以看出,确实如此。

  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jackey_Song_Odd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值