|
网站首页
|
业界新闻
|
小组
|
威客
|
人才
|
下载频道
|
博客
|
代码贴
|
在线编程
|
编程论坛
|
登录
注册
短消息
我发表的主题
我参与的主题
我收藏的贴子
我上传的附件
我下过的附件
编辑个人资料
我的博客
用户控制面板
搜索
道具
恢复默认风格
碧海青天
秋意盎然
棕红预览
粉色回忆
蓝雅绿
紫色淡雅
青青河草
e点小镇
橘子红了
红红夜思
水晶紫色
雪花飘飘
新年快乐
风格
短消息
论坛展区
帮助
编程论坛
→
开发语言
→
『 C语言论坛 』
→ 一个union的问题
我的收件箱(0)
欢迎加入我们,一同切磋技术
用户名:
密 码:
共有
657
人关注过本帖
标题:
一个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
快速回复:
一个union的问题
数据加载中...
关于我们
|
广告合作
|
编程中国
|
清除Cookies
|
TOP
|
手机版
编程中国
版权所有,并保留所有权利。
Powered by
Discuz
, Processed in 0.062842 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved