标题:关于union一个问题
只看楼主
gmac
Rank: 2
等 级:论坛游民
帖 子:174
专家分:85
注 册:2010-9-28
结帖率:96.67%
已结贴  问题点数:10 回复次数:8 
关于union一个问题
     以你的程序为例子,现在已经开辟了一个16位的空间,然后我们假定现在空间还没有被赋值,为:
     00000000 00000000
    那么在运行完代码
    a.x[0] = 10;
    a.x[1] = 1;
    之后,16位的空间变为:
     00000110 00000001
这个解释没有看懂,怎么变成这样的?
程序代码:
#include <stdio.h>
union
{
int i;
char x[2];
}a;
void main()
{
a.x[0] = 10;
a.x[1] = 1;
printf("%d",a.i);
}

搜索更多相关主题的帖子: union 
2010-10-24 14:51
wujieru
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:1
帖 子:1108
专家分:1939
注 册:2010-10-9
得分:0 
这个题目很经典
2010-10-24 15:03
gmac
Rank: 2
等 级:论坛游民
帖 子:174
专家分:85
注 册:2010-9-28
得分:0 
回复 2楼 wujieru
会的话,说说哦。我不懂
2010-10-24 15:20
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
得分:10 
   判断字节序

首先我们需要知道什么是小端字节序和大端字节序。
考虑一个16位整数,它由2个字节组成。内存中存储这两个字节有两种方法:一种是将低序字节存储在低地址中,高字节存储在高地址中,这称为小端字节序(little-endian)字节序;另一种是将高序字节存储在低地址中,低序字节存储在高地址中,这称为大端字节序(big-endian).
   其次我们需要知道用union怎么来查到主机的字节序,这就需要明白union的存储结构,那什么是Union呢,联合(union)是一种新的数据类型,它是一种特殊的变量;
   union 联合名{
        数据类型  成员名;
        数据类型  成员名;
        .......
    }联合变量名;
   联合表示几个变量公用一个内存位置,在不同的时间保存不同的数据类型和不同长度的变量。
   例如:
int
main( )
{
   union {
         int i;
         struct {
               char first;
               char second;
          }half;
        }number;
   number. i = 0x4241;
   printf( "%c%c\n" , number. half. first, number. half. second) ;
   return 0;
}

输出结果:
AB
 

下面就让我们看看用程序怎么来查看主机的字节序:

#include < stdio. h>
#include < stdlib. h>
int
main( )
{
     union {
          short s;
          char c[ sizeof ( short ) ] ;
     }un;
     un. s = 0x0102;
     if ( sizeof ( short ) = = 2) {
           if ( un. c[ 0] = = 1 && un. c[ 1] = = 2)
           printf( "big-endian\n" ) ;
           else if ( un. c[ 0] = = 2 &&un. c[ 1] = = 1)
           printf( "little-endian\n" ) ;
           else
           printf( "unkown" ) ;
     }
     exit( 0) ;
}


我就是真命天子,顺我者生,逆我者死!
2010-10-24 15:22
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
得分:0 
这是第一次见识到联合的用处,不过是 自找麻烦。

我就是真命天子,顺我者生,逆我者死!
2010-10-24 15:24
gmac
Rank: 2
等 级:论坛游民
帖 子:174
专家分:85
注 册:2010-9-28
得分:0 
回复 5楼 BlueGuy
额,能帮我把我说的这个题分析下?
2010-10-24 15:49
gmac
Rank: 2
等 级:论坛游民
帖 子:174
专家分:85
注 册:2010-9-28
得分:0 
回复 5楼 BlueGuy
a[0]=10,a[1]=1是怎么转换为00000110 00000001 若是二进制的话,前面应该是00001010啊?
2010-10-24 16:07
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
得分:0 
回复 7楼 gmac
你是对的, 前面应该是00001010

我就是真命天子,顺我者生,逆我者死!
2010-10-24 16:32
gmac
Rank: 2
等 级:论坛游民
帖 子:174
专家分:85
注 册:2010-9-28
得分:0 
回复 8楼 BlueGuy
额。。谢谢。我这从网上找的
2010-10-24 16:40



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-323832-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.060885 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved