int in=0xeef01f88;
int * ipoi=∈
char*cpoi=(char*)ipoi;
cout<<std::hex<<(int)*ipoi<<" "<<(int)*(cpoi)<<" "<<(int)*(cpoi+1)<<" "<<(int)*(cpoi+2)<<endl;
当我在Cxxdroid(Android编译器)上进行编译时,它可以按预期正常工作,因此从char指针进行cout可以给出单独字节的值,例如:
eef01f88 88 1f f0.
当我使用GNU GCC COMPILER在Windows上编译相同的代码时,另一种方式得到以下输出:
eef01f88 ffffff88 1f fffffff0.
怎么可能?为什么第一个和第三个char指针值本身具有ffffff? *(cpoi+1)
周围甚至没有ff值。 (f0)
更改编译器会解决此问题吗?
我正在使用代码块。它有很多编译选项,但是我已经尝试了所有可用的标准(直到2011 ISO C语言标准)。我想念什么?
答案 0 :(得分:1)
char
用于存储字符,而不是数字值,因此可以根据实现对其进行签名或不签名
char
is usually an unsigned type上,因为it's more efficient,因此将char
强制转换为int
导致零扩展名char
在默认情况下都是带符号的类型,因此这些字节将被签名扩展为int
。由于0x88和0xf0为负,因此它们的高位只有一位。解决方案是避免使用char
,而改用signed char
或unsigned char
,或者通过添加选项来更改char的符号(gcc中的-funsigned-char
)来解决。甚至更好,请使用固定宽度类型,例如uint8_t
和int8_t
请参见