闪亮的马路 发表于 2019-11-12 15:39:58

C++的union类型转化

#include <iostream>
using namespace std;

//unsigned char a = 0x23;
union fd
{
    float d;
    //int a;
    unsigned char data;
}speed;

int main()
{
    speed.d = 16;
    for(int i=0;i<4;i++)
    {
      cout << i<<":" <<int(speed.data)<<endl;
    }
    return 0;
}
为什么上述代码执行结果是这样的呢?
0:0
1:0
2:128
3:65

jackz007 发表于 2019-11-12 16:30:59

本帖最后由 jackz007 于 2019-11-12 16:39 编辑

      这没什么啊,这说明 浮点数 16 的二进制编码是 4 个字节: 00,00,128,65

      这个说法可以在下面的代码中得到验证:
#include <iostream>

using namespace std         ;

union fd {
    float d                   ;
    unsigned char data   ;
} speed                     ;

int main()
{
    speed . data = 0       ;
    speed . data = 0       ;
    speed . data = 128   ;
    speed . data = 65      ;

    cout << speed . d << endl ;
    return 0                  ;
}

      楼主应该深刻理解 C / C++ 语言的数据类型 union,就是不同类型的数据共享一块内存的意思,比如,本例中的 speed,总共占用 4 个字节,通过 speed . d 访问,它就是 4 个 unsigned char,通过 speed . d 访问,它就是 1 个 float,其实,访问的那 4 个字节都是同一个。

闪亮的马路 发表于 2019-11-12 16:36:14

本帖最后由 闪亮的马路 于 2019-11-12 16:37 编辑

jackz007 发表于 2019-11-12 16:30
这没什么啊,这说明 浮点数 16 的二进制编码是 4 个字节: 00,00,128,65

      这个说法 ...

关键是怎么与float d赋值的16相对应?我想知道它们的换算关系

jackz007 发表于 2019-11-12 16:45:08

闪亮的马路 发表于 2019-11-12 16:36
关键是怎么与float d赋值的16相对应?我想知道它们的换算关系

      要了解 0,0,128,65 和浮点数 16 的换算关系,那就只能找 IEEE32 浮点数编码规范了,这是一个国际标准,你自己问一下度娘吧。

bin554385863 发表于 2019-11-12 19:05:59

联合的作用是两个变量公用一块内存空间,所以同时只能使用其中一个成员,告诉我你想让它们怎么对应
页: [1]
查看完整版本: C++的union类型转化