搜索
编程论坛
→
开发语言
→
『 C语言论坛 』
→ 一个union的问题
标题:
一个union的问题
只看楼主
xzy199999
等 级:
业余侠客
帖 子: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
等 级:
黑侠
帖 子:214
专家分:663
注 册:2011-12-1
第
2
楼
得分:7
char y:3;
:是什么意思?
所有的变量值应该和a.a相同,如果你不明白,说明你没有看union的定义。
2012-03-15 00:18
xzy199999
等 级:
业余侠客
帖 子:326
专家分:286
注 册:2010-11-19
第
3
楼
得分:0
回复 2楼 share32
和a.a相同为什么就会变成0xffffffff啊?
我是初学者
2012-03-15 09:37
share32
等 级:
黑侠
帖 子:214
专家分:663
注 册:2011-12-1
第
4
楼
得分:0
回复 3楼 xzy199999
char y:3;
char z:3;
char x:2;
这样定义,冒号和后面的数字是什么含意?
另外输出16进制是%x,不用%0x
2012-03-15 12:04
xzy199999
等 级:
业余侠客
帖 子:326
专家分:286
注 册:2010-11-19
第
5
楼
得分:0
回复 4楼 share32
冒号后面表示占多少位,这样还是不知道怎么得出ffffffff
我是初学者
2012-03-15 21:42
xzy199999
等 级:
业余侠客
帖 子:326
专家分:286
注 册:2010-11-19
第
6
楼
得分:0
有人吗
我是初学者
2012-03-16 11:35
mapy06
等 级:
论坛游民
威 望:
1
帖 子:19
专家分:43
注 册:2012-3-6
第
7
楼
得分: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
来 自:广州
等 级:
小飞侠
威 望:
6
帖 子:1043
专家分:2754
注 册:2009-8-18
第
8
楼
得分: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
等 级:
论坛游民
威 望:
1
帖 子:19
专家分:43
注 册:2012-3-6
第
9
楼
得分: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
来 自:广州
等 级:
小飞侠
威 望:
6
帖 子:1043
专家分:2754
注 册:2009-8-18
第
10
楼
得分:0
TO LS
确定有误
类型提升有两种情况:
1. 符号扩展:对于有符号数,扩展存储位数的方法。在新的高位字节使用当前最高有效位即符号位的值进行填充。
2. 零扩展:对于无符号数,扩展存储位数的方法。在新的高位直接填0.
[
本帖最后由 longlong89 于 2012-3-17 09:37 编辑
]
想象力征服世界
2012-03-17 09:24
10
1/1页
1
参与讨论请移步原网站贴子:
https://bbs.bccn.net/thread-363206-1-1.html
关于我们
|
广告合作
|
编程中国
|
清除Cookies
|
TOP
|
手机版
编程中国
版权所有,并保留所有权利。
Powered by
Discuz
, Processed in 0.059382 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved