C++:int* / float* 到 char*,为什么使用 reinterpret_cast 得到不同的结果?
C++ : int* / float* to char*, why get different result using reinterpret_cast?
int* 到 char* :
<pre>int* pNum = new int[1];
pNum[0] = 57;
char* pChar = reinterpret_cast< char* >(pNum);</pre>
Result : pChar[0] = '9'; //'9' ASCII 57
float* 到 char* :
<pre>float* pFloat = new float[1];
pFloat[0] = 57; //assign the same value as before
char* pChar = reinterpret_cast< char* >(pFloat);</pre>
Result : pChar[0] = 'a';
为什么我会得到两个不同的结果?
感谢您的帮助。
你有这个是因为浮点值不使用与整数值相同的编码(使用尾数+指数或类似的编码的 IEEE 编码)
此外,我想你是 运行 小端 CPU,否则你的第一次测试会产生 0(我的意思是 '[=10=]'
)。
float
和int
都是(通常)用四个字节表示的数据类型:
b1 b2 b3 b4
但是,这些字节在这两种类型中的解释完全不同 - 如果不这样,则几乎不需要两种类型。
现在,如果您重新解释指向字符指针的指针,结果将仅指向第一个字节,因为这是 char
:
的长度
b1 b2 b3 b4
^^
your char* points to here
如前所述,第一个字节对于两种数据类型具有非常不同的含义,这就是 char
的表示形式通常不同的原因。
对你的例子的应用:
float(IEEE754单精度32位)中的数字57
用位表示为
01000010 01100100 00000000 00000000
相比之下,32位整数格式的表示是
00000000 00000000 00000000 00111001
这里的数字似乎以 "big-endian" 格式表示,其中最重要的字节(改变 int 值最多的字节)排在第一位。正如@Jean-FrançoisFabre 所提到的,在您的 PC 中它似乎是相反的,但没关系。对于这两种转换,我都使用了 this site.
现在您的 char*
指针分别指向那些 8 位块中的第一个。显然它们是不同的。
int* 到 char* :
<pre>int* pNum = new int[1]; pNum[0] = 57; char* pChar = reinterpret_cast< char* >(pNum);</pre>
Result : pChar[0] = '9'; //'9' ASCII 57
float* 到 char* :
<pre>float* pFloat = new float[1]; pFloat[0] = 57; //assign the same value as before char* pChar = reinterpret_cast< char* >(pFloat);</pre>
Result : pChar[0] = 'a';
为什么我会得到两个不同的结果?
感谢您的帮助。
你有这个是因为浮点值不使用与整数值相同的编码(使用尾数+指数或类似的编码的 IEEE 编码)
此外,我想你是 运行 小端 CPU,否则你的第一次测试会产生 0(我的意思是 '[=10=]'
)。
float
和int
都是(通常)用四个字节表示的数据类型:
b1 b2 b3 b4
但是,这些字节在这两种类型中的解释完全不同 - 如果不这样,则几乎不需要两种类型。
现在,如果您重新解释指向字符指针的指针,结果将仅指向第一个字节,因为这是 char
:
b1 b2 b3 b4
^^
your char* points to here
如前所述,第一个字节对于两种数据类型具有非常不同的含义,这就是 char
的表示形式通常不同的原因。
对你的例子的应用:
float(IEEE754单精度32位)中的数字57
用位表示为
01000010 01100100 00000000 00000000
相比之下,32位整数格式的表示是
00000000 00000000 00000000 00111001
这里的数字似乎以 "big-endian" 格式表示,其中最重要的字节(改变 int 值最多的字节)排在第一位。正如@Jean-FrançoisFabre 所提到的,在您的 PC 中它似乎是相反的,但没关系。对于这两种转换,我都使用了 this site.
现在您的 char*
指针分别指向那些 8 位块中的第一个。显然它们是不同的。