栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

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

运行结果:

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

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

#include 
int main(){
        union key{
                int k;
                char ch[2];
        }u;
        printf("%dn",sizeof(u));    //输出u所占的字节数
        int i = 0;
        while(1){
                scanf("%d",&u.k);
                printf("%d %dn",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 
int main(){
        union key{
                int k;
                char ch[4];
        }u;
        printf("%dn",sizeof(u));
        int i = 0;
        while(1){
                scanf("%d",&u.k);
                printf("%d %d %d %dn",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。那么运行一下检验结果:

由结果可以看出,确实如此。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/429330.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号