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

时间:2016-10-12 14:30:20

标签: c++ reinterpret-cast

  • int * char *

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

      

    结果:pChar [0] =&#39; 9&#39 ;; //&#39; 9&#39; ASCII 57

  • float * char *

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

  

结果:pChar [0] =&#39; a&#39 ;;

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:4)

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

b1 b2 b3 b4

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

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

b1 b2 b3 b4
^^
your char* points to here

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

应用于您的示例:

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

01000010 01100100 00000000 00000000

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

00000000 00000000 00000000 00111001

这里的数字似乎以“big-endian”格式表示,其中最重要的字节(最能改变int值的字节)首先出现。正如@ Jean-FrançoisFabre所提到的那样,在你的电脑中它似乎是另一回事,但是没关系。对于这两次转化,我使用了this site

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