| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1779 人关注过本帖
标题:c的32位关键字剩下几个,先搞定联合体再说!!!
只看楼主 加入收藏
jokerskill
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:392
专家分:554
注 册:2012-3-4
结帖率:73.08%
收藏
已结贴  问题点数:100 回复次数:24 
c的32位关键字剩下几个,先搞定联合体再说!!!
别关我的贴啊!!!我不经常发贴的,
#include

int main(void)
{
long int c = 0;
union try {
int a;
int b;
};
union try test;
test.a = 10;
test.b = 20;
printf("test.a = %d\n",test.a);
printf("test.b = %d\n",test.b);
c = test.a;
printf("c = %d\n",c);
c = test.b;
printf("c = %d",c);
return 0;
}
输出:
test.a = 20
test.b = 20
test.a = 20
test.b = 20

刚刚听了版主的,理解了一点关于联合体的问题,:
版主:这个结果正是证明联合体与结构体的不同,test.a,test.b实际上使用的同一空间。

我还有一些问题:
如果联合体的成员都是使用同一个的内存空间(同一变量),那么定义一个成员,和定义多个联合体成员有分别吗???
既然都只能要一个成员还定义那么多其他的成员有意义吗???

搜索更多相关主题的帖子: 结构体 return include 
2012-07-07 17:07
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你有时也是该打。好好看书,有介绍union是派什么用途的,我以前有帖子也详细说过这个问题,不想重复再答你而已。

授人以渔,不授人以鱼。
2012-07-07 17:19
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
同一个的内存空间(同一变量)!!!同一个内存空间与同一变量不是一个概念。
教材里在讲到联合体时没有举一个具体的例子,让初学者难以理解

总有那身价贱的人给作业贴回复完整的代码
2012-07-07 17:20
netlin
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:24
帖 子:544
专家分:4308
注 册:2012-4-9
收藏
得分:0 
这个地方是比较难懂一些,要花费一些脑筋!

做自己喜欢的事!
2012-07-07 17:23
yuma
Rank: 12Rank: 12Rank: 12
来 自:银河系
等 级:贵宾
威 望:37
帖 子:1934
专家分:3012
注 册:2009-12-22
收藏
得分:13 
多看看书,基本的东西一定要记牢。

心生万象,万象皆程序!
本人计算机知识网:http://bbs.为防伸手党,本站已停止会员注册。
2012-07-07 17:33
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:13 
union {},是定义一块内存,这块内存对外可以用多个名字来引用。比如你的定义
union try
{
    int a;
    int b;
}
这个try其实只有1个int的大小,里面存放的数据,在外部可以用try.a来表示,也可以用try.b来表示,都是同一个东西!

一般的用法,可以这样写:
union try
{
    char s[4];
    int x;
}
在32位程序中,int是4byte,故定义s也最好是4byte。当你赋值try.x = 65的时候,其实相当于赋值try.s[0] = 'A'。

用下面的测试程序,你就能看得更清晰了:
程序代码:
#include <cstdio>
#include <conio.h>

union Test
{
    char s[4];
    int x;
} test;

void main(void)
{
    test.x = 65;
    for (int i = 0; i < 4; ++i)
    {
        _putch(test.s[i]);
    }
    printf("\nsizeof(test) = %d\n", sizeof(test));
    printf("address of x: %d\n", &(test.x));
    printf("address of s: %d\n", test.s);

    _getch();
}


[ 本帖最后由 TonyDeng 于 2012-7-7 17:59 编辑 ]

授人以渔,不授人以鱼。
2012-07-07 17:40
netlin
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:24
帖 子:544
专家分:4308
注 册:2012-4-9
收藏
得分:13 
楼主在例子中举的是:
union try {
int a;
int b;
};

其实,联合体内的成员的数据类型和数据宽度可以不同的,且每个成员都占用的是同一块空间,
联合体类型变量所占据的空间就是联合体内的数据宽度最大的成员的数据宽度。
如果先后给联合体变量内的成员赋值,后面的赋值操作,会覆盖前面的赋值操作。

我举个例子吧:(修改楼主的例子)
union try {
int a;
char b;
};
union try test;
test.a = 10;
test.b = 'a';
printf("test.a = %d\n",test.a);
printf("test.b = %c\n",test.b);

联合体中,成员a的数据宽度是4,b的数据宽度是1,

联合体变量test的数据宽度是4(取成员的最大宽度,而不是所有成员宽度的和,这个与结构体变量的显著不同)

有劳哪位有调试环境的兄弟,运行一下我上面这个例子,请把结果贴出来。

结果将会让人很费解,如果能理解这个结果了,那么对联合体数据类型的理解也差不多了,当然,你也就知道了联合体类型是用在什么地方了。


[ 本帖最后由 netlin 于 2012-7-8 01:06 编辑 ]

做自己喜欢的事!
2012-07-07 17:48
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
手机没法说得太细,先转个帖,楼主看看能明白不
联合体到底有什么用
说了联合体的定义,接下来看看联合体到底有什么用,在这之前,先看个问题。对于51定时器16位的用法,一般我们都采取如下方法给其赋值:
1取余和取模法
TH0 = (65535-7000)/256;   //通过取余得到定时器0高8位的初值
TL0 = (65535-7000)%256;  //通过取模得到定时器0低8位的初值
2移位屏蔽发
TH0=(INT8U)((65535-7000)>>8); //通过右移将高8位的值送入TH0 (相当于取余)
TL0=(INT8U)((65535-7000)&0x00ff);//通过位与运算将高8位屏蔽,从而得到低8位的值送入TL0
上面两种方法中第二种虽然要好与第一种,51的移位操作要比除法操作节省资源,但还是消耗了一部分资源.有没有更好的办法呢.哈哈,估计你也猜到了,该我们今天的主角联合(UNION)出场了:
首先我们声明一个联合变量
union union_temp16
{
    INT16U un_temp16;
    INT8U  un_temp8[2];
}my_unTemp16;
可以看到在联合中有两个成员,一个是16位的un_temp16;另一个是8位的un_temp8的数组,数组长度是2,占用内存大小也是16。按照联合的定义,my_unTemp16的size是16
接下来我们先给联合体成员un_temp16赋值
my_unTemp16.un_temp16 = 65535-7000;
接着给定时器赋初值
TH0 = my_unTemp16.um_temp8[0];
TL0 = my_unTemp16.um_temp8[1];
是不是很好用呀,相当于只是多申请了一个int型变量,就很容易的把一个int型变量拆成了2个char型变量

总有那身价贱的人给作业贴回复完整的代码
2012-07-07 18:04
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
呵呵,要不是看在几位已经如此认真地给你解答的份上我又要关你的贴子了。

这种问题我是归类于脑残级别的。连这么基础的知识都不能自学你快另某出路吧。

最后,希望你把专家分认真地分配给认真回答你问题的人,如果我发现你只是草草的散分,以后见你一贴删一贴。

重剑无锋,大巧不工
2012-07-07 18:14
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
散分很好 不要打击新人

话说楼上大牛头像很吓人啊。。。。
2012-07-07 19:10
快速回复:c的32位关键字剩下几个,先搞定联合体再说!!!
数据加载中...
 
   



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

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