标题:一个union的问题
只看楼主
xzy199999
Rank: 4
等 级:业余侠客
帖 子:326
专家分:286
注 册:2010-11-19
结帖率:92.45%
已结贴  问题点数:20 回复次数:9 
一个union的问题
#include <stdio.h>
int main(void)
{
    union A
    {
        char a;
        char y:3;
        char z:3;
        char x:2;
    }a;
    a.a=0x67;
    printf("%0x\n%0x\n%0x\n%0x\n",a.a,a.y,a.z,a.x);
    return 0;
}
为什么结果会是这样的 为什么会变成ffffffff?
搜索更多相关主题的帖子: void ffffffff include return 
2012-03-14 23:22
share32
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:214
专家分:663
注 册:2011-12-1
得分:7 
char y:3;
 :是什么意思?
所有的变量值应该和a.a相同,如果你不明白,说明你没有看union的定义。
2012-03-15 00:18
xzy199999
Rank: 4
等 级:业余侠客
帖 子:326
专家分:286
注 册:2010-11-19
得分:0 
回复 2楼 share32
和a.a相同为什么就会变成0xffffffff啊?

我是初学者
2012-03-15 09:37
share32
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:214
专家分:663
注 册:2011-12-1
得分:0 
回复 3楼 xzy199999
char y:3;
char z:3;
char x:2;

这样定义,冒号和后面的数字是什么含意?

另外输出16进制是%x,不用%0x
2012-03-15 12:04
xzy199999
Rank: 4
等 级:业余侠客
帖 子:326
专家分:286
注 册:2010-11-19
得分:0 
回复 4楼 share32
冒号后面表示占多少位,这样还是不知道怎么得出ffffffff

我是初学者
2012-03-15 21:42
xzy199999
Rank: 4
等 级:业余侠客
帖 子:326
专家分:286
注 册:2010-11-19
得分:0 
有人吗

我是初学者
2012-03-16 11:35
mapy06
Rank: 2
等 级:论坛游民
威 望:1
帖 子:19
专家分:43
注 册:2012-3-6
得分:7 
这个和二进制有关;
a.a  a.x  a.y a.x  的首地址相同,
当a.a = 0x67时
二进制是0110 0111;
些时,a.x 取后三位是  111  而因a.x 只有三位,所以二进制111的第一个1是符号位,就是负数了,111 = -1;
a.y,a.z同理,在16进制里面-1 =  ffff ffff   ;
所以输出 就是ffff ffff;
你可以将变量 的位多取一点,试试!  
        
            
2012-03-16 13:32
longlong89
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广州
等 级:小飞侠
威 望:6
帖 子:1043
专家分:2754
注 册:2009-8-18
得分:7 
union A
    {
        char a;
        char y:3;
        char z:3;
        char x:2;
    }a;
a.a=0x67;
h表示该值为16进制 b表示该值为二进制
67h:0110 0111b
y占用3位,而A为union,所以y=111b,y为signed char类型,printf %x时需要做类型转换提升为int 所有前面的空位补1(如果是unsigned则补0) 即ffffffffh
同理 z、x也是ffffffffh

[ 本帖最后由 longlong89 于 2012-3-16 15:37 编辑 ]

想象力征服世界
2012-03-16 15:30
mapy06
Rank: 2
等 级:论坛游民
威 望:1
帖 子:19
专家分:43
注 册:2012-3-6
得分:0 
8楼,类型提升是对的,但空位补1,我表示不理解!
char a 是8bite  
int  a  是32bite(在32位系统)
按你的理解:
将char a 按int a (16进制)输出 ,char a 的前24位是不是要补1,那输出结果应该是0xffff ff67;

类型提升直接在位前补0和1,我也是第一次听说。。。。。。。。。。。。。。。。

呵呵
你将位数多取一点,看看是不是空位补 1 ;
2012-03-16 18:23
longlong89
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广州
等 级:小飞侠
威 望:6
帖 子:1043
专家分:2754
注 册:2009-8-18
得分:0 
TO LS
确定有误
类型提升有两种情况:
1. 符号扩展:对于有符号数,扩展存储位数的方法。在新的高位字节使用当前最高有效位即符号位的值进行填充。
2. 零扩展:对于无符号数,扩展存储位数的方法。在新的高位直接填0.

[ 本帖最后由 longlong89 于 2012-3-17 09:37 编辑 ]

想象力征服世界
2012-03-17 09:24



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




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

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