| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 678 人关注过本帖
标题:关于联合体的一个问题
只看楼主 加入收藏
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
结帖率:88.89%
收藏
已结贴  问题点数:50 回复次数:8 
关于联合体的一个问题
#include <stdio.h>

int main(void)
{
    unsigned int uint;
    int sint;
    float ft;

    char *p;

    union
    {
    unsigned int a;
    char b[4];
    } un;

    un.a=0x77654321;
    uint=0x77654321;


    p=(char*)&uint;
    printf("*p=%x,*p+1=%x,*p+2=%x,*p+3=%x\n",*p,*(p+1),*(p+2),*(p+3));
    printf("b[0]%x,b[1]=%x,b[2]=%x,b[3]=%x\n",un.b[0],un.b[1],un.b[2],un.b[3]);

    return 0;
}
代码如上所示,我的想法是把无符号整形的四个字节逐个打印出来看,结果发现,如果
数据的最高位不为1,那么显示结果是正确的。比如
    un.a=0x77654321;
    uint=0x77654321;
得到
*p=21,*p+1=43,*p+2=65,*p+3=77
b[0]21,b[1]=43,b[2]=65,b[3]=77
但是,如果最高位不为1,比如
    un.a=0x87654321;
    uint=0x87654321;
那么得到的最高字节为一个32bit的数,这是为什么?
*p=21,*p+1=43,*p+2=65,*p+3=ffffff87
b[0]21,b[1]=43,b[2]=65,b[3]=ffffff87
请大家帮忙一起看下,谢谢
搜索更多相关主题的帖子: void include return 
2012-08-01 22:08
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:50 
因为char是有符号的?
2012-08-01 22:16
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
程序代码:
#include <stdio.h>

int main(void)
{
    unsigned int uint;
    int sint;
    float ft;

    unsigned char *p;

    union
    {
    unsigned int a;
    unsigned char b[4];
    } un;

    un.a=0x87654321;
    uint=0x87654321;


    p=(unsigned char*)&uint;
    printf("*p=%x,*p+1=%x,*p+2=%x,*p+3=%x\n",*p,*(p+1),*(p+2),*(p+3));
    printf("b[0]%x,b[1]=%x,b[2]=%x,b[3]=%x\n",un.b[0],un.b[1],un.b[2],un.b[3]);

    return 0;
}


2012-08-01 22:19
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
跟转换有关系罢 这样改就正常了
2012-08-01 22:19
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
刚才竟然停电了。。。。

p=(char*)&uint;
printf("*p=%x,*p+1=%x,*p+2=%x,*p+3=%x\n",*p,*(p+1),*(p+2),*(p+3));

输出的时候得压栈啊 压栈都是压的32位的量 你这里p指向的又是char 是有符号的 0x87最高位为1 那就认为是负数了 所以 得转 转了之后就是你看到的那个了 高位填了1 所以是ffff神马的

也可以理解为 char类型转换转为了int 转的时候造成了输出的错误


2012-08-01 22:57
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
程序代码:
#include <stdio.h>

int main(void)
{
    char a = 0x87;
    printf("%x", a);
    return 0;
}


最简单的就是这样了

解决很简单 改成无符号不让它扩充符号位 这就没错了

程序代码:

#include <stdio.h>

int main(void)
{
    unsigned char a = 0x87;
    printf("%x", a);
    return 0;
}



[ 本帖最后由 zklhp 于 2012-8-1 23:00 编辑 ]
2012-08-01 22:59
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
有问题欢迎再问 没问题结题哈
2012-08-01 23:00
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
收藏
得分:0 
谢谢版主的热心帮助,确实是%x造成的问题,%x进行了符号位扩展
我用一个8bit的数据0x89,如果%x打印出来也是转成了32bit的,如下
    char c=0x89;
    printf("c=%x\n",c);
得到c=ffffff89
这样应该能确定是显示的问题,所以我用gdb直接看内存的数据,得到如下结果
    char c=0x89;
    un.a=0x87678321;
    uint=0x87858321;
(gdb) x/4xb &un
0xbffff3f8:    0x21    0x83    0x67    0x87
(gdb) x/1xb &c
0xbffff40f:    0x89
(gdb) x/4xb &uint
0xbffff408:    0x21    0x83    0x85    0x87
这样一看,果然是printf在显示的时候出的问题,内存中是不会有符号扩展的。

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2012-08-02 05:57
wangxiang935
Rank: 3Rank: 3
来 自:南京
等 级:论坛游侠
帖 子:177
专家分:179
注 册:2012-7-11
收藏
得分:0 
原来如此
2012-08-02 08:42
快速回复:关于联合体的一个问题
数据加载中...
 
   



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

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