回 帖 发 新 帖 刷新版面

主题:共用体变量使用出错~

以下为我做的一例题的代码:
#include <stdio.h>
union number
{
    int x;
    float y;
};
main()
{
    union number value;                        /*声明类型为union number的变量value*/
    value.x=100;                                    /*为value的元素x赋值*/
    printf("%s\n%s\n%s%d\n%s%f\n\n",
            "Put a value in the integer member",
            "and print both members.",
            "int:",value.x,
            "float:",value.y);
    value.y=12;                        /*为value的元素y赋值*/
    printf("%s\n%s\n%s%d\n%s%f\n\n",
        "Put a value in the floating member",
        "and print both members.",
        "int:",value.x,
        "float:",value.y);
    getch();
}
结果,为图片附件,我已经在VS2008,VC6.0,中都试过了,
为什么第二次输出时,value中x输出为一个其他数,不为0(书上的结果为0)~

回复列表 (共4个回复)

沙发

    union的使用是对其中的成员只能N选一作为存储。
    楼主做第二次输出的时候,先给value.y赋值为12,在输出value.y的值的时候自然就是12了,但是输出value.x的时候,并不是将value.y进行类型转换,转变为一个整数类型进行输出,而是取value.y的前四个字节(整数类型长度为4字节)作为value.x的值作为输出。而value.y的值是12,在内存中的存储结构如下所示:
              符号位      阶码       尾数     长度  
  float         1           8         23       32。
把12这个数值填入对应的比特位以后,按照整数类型来计算就是 1094713344。
    书上说是0,那是错的。
    楼主可以参考如下程序:

#include <stdio.h>

int main()
{
    float mm_float = 12;                  // 定义一个float类型变量,初始化为12;
    int *pInt = (int *)(&mm_float);       // 取变量mm_float的前四个字节的值付给*pInt,
    printf("%d\n", *pInt);                // 把取到的前四个字节的值输出。

    getchar();
    return 0;
}

输出为: 1094713344

板凳


那第一个输出呢,已经对value中的x赋值100,在用value.y输出时为什么就为0?请分析下,谢谢

3 楼

去看一下float在内存中的存储规则吧,共用体一共开出了一个float类型的长的内存,其中前面的字节共享给了int,后面的是float专用

4 楼

这么神奇  学习了

我来回复

您尚未登录,请登录后再回复。点此登录或注册