我试图访问浮点数中的单个字节,我得到意想不到的结果

时间:2014-06-08 03:06:07

标签: c++ floating-point

所以到目前为止我有这个:

#include <iostream>
#include <string>
#include <typeinfo>

using namespace std;

int main ()
{
    float f = 3.45;           // just an example fp#
    char* ptr = (char*)&f;    // a character pointer to the first byte of the fp#?

    cout << int(ptr[0]) << endl; // these lines are just to see if I get what I 
    cout << int(ptr[1]) << endl; // am looking for... I want ints that I can 
    cout << int(ptr[2]) << endl; // otherwise manipulate.
    cout << int(ptr[3]) << endl;
}
the result is:
-51
-52
92
64

所以很明显-51和-52不在我期望的字符范围内...我已经从类似的问题中获取信息来得到这个代码,从所有的讨论中,从char到int的转换是直截了当。那么为什么负值呢?我试着看一个四字节的数字,因此我希望有4个整数,每个整数在0-255范围内。

我在Windows 8.1设备上使用带有gcc 4.8.1的Codeblocks 13.12和选项-std = C ++ 11。

编辑: 所以解决方案是使用:

unsigned char* ptr = reinterpret_cast<unsigned char*>( &f );

感谢您的所有回复。

1 个答案:

答案 0 :(得分:6)

使用unsigned char获取(保证)无符号值。

你得到负值,因为你的编译器和编译器选项(是的,重要的)char是签名类型。


顺便说一句,前缀+运算符是一种方便,简洁的方法,可以将char提升为int,以显示数值。


另外,顺便说一句,使用C ++命名的强制转换(reinterpret_castconst_caststatic_castdynamic_cast)代替C样式强制转换通常是个好主意,指针有关。这是因为C样式转换可以最终做出意想不到的事情,特别是在代码被维护和类型改变时。在这种情况下,你表达了一个reinterpret_cast,所以这是一个使用的 - 只是为了好习惯。