C++:int*/float*to char*,为什么使用reinterpret_cast得到不同的结果?

xtl*_*luo 0 c++ reinterpret-cast

  • int*char*:

    int* pNum = new int[1];
    pNum[0] = 57;
    char* pChar = reinterpret_cast< char* >(pNum);

    float* pFloat = new float[1];
    pFloat[0] = 57; //assign the same value as before
    char* pChar = reinterpret_cast< char* >(pFloat);

结果:pChar [0] ='a';

那么为什么我得到两个不同的结果呢?

谢谢你的帮助.

Jea*_*bre 8

你有这个,因为浮点值不使用相同的编码作为整数值(IEEE编码与尾数+指数或类似的东西)

此外,我想你正在运行一个小端CPU,否则你的第一次测试会产生0(我的意思是'\0').


dav*_*igh 5

两者floatint(通常)由四个字节表示的数据类型:

\n\n
b1 b2 b3 b4\n
Run Code Online (Sandbox Code Playgroud)\n\n

然而,这些字节在两种类型中的解释方式完全不同 - 如果它们不这样做,则几乎不需要两种类型。

\n\n

现在,如果您重新解释指向 char 指针的指针,结果仅指向第一个字节,因为这是 a 的长度char

\n\n
b1 b2 b3 b4\n^^\nyour char* points to here\n
Run Code Online (Sandbox Code Playgroud)\n\n

如前所述,第一个字节对于两种数据类型具有非常不同的含义,这就是为什么 a 的表示形式char通常不同。

\n\n
\n\n

应用到您的示例:

\n\n

float 中的数字57(IEEE754 单精度 32 位)以位为单位表示为

\n\n
01000010 01100100 00000000 00000000\n
Run Code Online (Sandbox Code Playgroud)\n\n

相反,32 位整数格式的表示为

\n\n
00000000 00000000 00000000 00111001\n
Run Code Online (Sandbox Code Playgroud)\n\n

这里的数字似乎以“big-endian”格式表示,其中最重要的字节(对 int 值变化最大的字节)排在第一位。正如 @Jean-Fran\xc3\xa7oisFabre 所提到的,在你的电脑中似乎是相反的,但没关系。对于这两次转换,我都使用了这个网站

\n\n

现在您的char*指针分别指向这些 8 位块中的第一个。显然它们是不同的。

\n