鱼C论坛

 找回密码
 立即注册
查看: 60|回复: 1

共用体

[复制链接]
发表于 2022-11-24 19:08:06 | 显示全部楼层 |阅读模式

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

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

x
  1. #include<stdio.h>
  2. void partition(unsigned long int num)
  3. {
  4.         union a
  5.         {
  6.                 unsigned int part[2];
  7.                 unsigned long int w;
  8.         }n,*p;
  9.         p=&n;
  10.         n.w=num;
  11.         printf("long int=%lx\n",num);
  12.         printf("low-part num=%0x,high-part num=%0x\n",p->part[0],p->part[1]);
  13. }
  14. int main()
  15. {
  16.         unsigned long int x;
  17.         x=0x23456789;
  18.         partition(x);
  19.         return 0;
  20. }
复制代码

这个代码能解释一下吗
QQ图片20221123192503.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2022-11-24 19:45:08 | 显示全部楼层
本帖最后由 jackz007 于 2022-11-24 19:55 编辑

        这个教材太老,不适合今天,一个 int 占用 2 字节,那是 DOS 时代 16 位程序横行时的事情,如果在今天使用,必须改代码。
  1. #include<stdio.h>

  2. void partition(unsigned int num)
  3. {
  4.         union a
  5.         {
  6.                 unsigned short part[2] ; // 共用体成员 part 是一个有 2 个 unsigned short 型元素的一维数组
  7.                 unsigned int w         ; // 共用体成员 w 是一个 unsigned int 型的变量
  8.         } n , * p                      ; // 共用体的容量由体量最大的成员决定,所以,这个共用体占用的存储空间由成员 w 决定,是 4 个字节
  9.                                          // 共用体 w 和 part 两个成员将会使用同一个储存空间 (4 个字节),可以视为对同一个变量的两个不同性质的引用  
  10.         p = & n                        ; // p 指向共用体 n
  11.         n . w = num                    ; // 为共用体 n 的 w 成员赋值为输入参数 num
  12.                                          // num 的值为 0x23456789,我们使用的 PC 采用 Little Indian 编码,这 4 个字节在内存中的实际顺序为:89 67 45 23
  13.                                          // 也就是说,共用体 n 内存中 4 个字节的内容为 89 67 45 23,其中,part 成员由 2 个 2 个字节的成员构成,于是,
  14.                                          // n . part[0] : 89 67,值为 0x6789,n . part[1] : 45 23,值为 0x2345
  15.         printf("num = 0x%x\n" , num)     ;
  16.         printf("low-part num = 0x%0x , high - part num = 0x%0x\n" , p-> part[0] , p -> part[1]) ;
  17. }

  18. int main()
  19. {
  20.         unsigned int  x ;
  21.         x = 0x23456789  ;
  22.         partition(x)    ;
  23.         return 0        ;
  24. }
复制代码

        编译运行实况:
  1. D:\[00.Exerciese.2022]\C>g++ -o x x.c

  2. D:\[00.Exerciese.2022]\C>x
  3. num = 0x23456789
  4. low-part num = 0x6789 , high - part num = 0x2345

  5. D:\[00.Exerciese.2022]\C>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2022-12-5 09:12

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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