所以到目前为止我有这个:
#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 );
感谢您的所有回复。
答案 0 :(得分:6)
使用unsigned char
获取(保证)无符号值。
你得到负值,因为你的编译器和编译器选项(是的,重要的)char
是签名类型。
顺便说一句,前缀+
运算符是一种方便,简洁的方法,可以将char
提升为int
,以显示数值。
另外,顺便说一句,使用C ++命名的强制转换(reinterpret_cast
,const_cast
,static_cast
和dynamic_cast
)代替C样式强制转换通常是个好主意,指针有关。这是因为C样式转换可以最终做出意想不到的事情,特别是在代码被维护和类型改变时。在这种情况下,你表达了一个reinterpret_cast
,所以这是一个使用的 - 只是为了好习惯。