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



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

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