h-b-z-d-j-s-m 发表于 2022-11-24 19:08:06

共用体

#include<stdio.h>
void partition(unsigned long int num)
{
        union a
        {
                unsigned int part;
                unsigned long int w;
        }n,*p;
        p=&n;
        n.w=num;
        printf("long int=%lx\n",num);
        printf("low-part num=%0x,high-part num=%0x\n",p->part,p->part);
}
int main()
{
        unsigned long int x;
        x=0x23456789;
        partition(x);
        return 0;
}
这个代码能解释一下吗

jackz007 发表于 2022-11-24 19:45:08

本帖最后由 jackz007 于 2022-11-24 19:55 编辑

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

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

int main()
{
      unsigned intx ;
      x = 0x23456789;
      partition(x)    ;
      return 0      ;
}
      编译运行实况:
D:\\C>g++ -o x x.c

D:\\C>x
num = 0x23456789
low-part num = 0x6789 , high - part num = 0x2345

D:\\C>
页: [1]
查看完整版本: 共用体