为什么char指针会获得32位值(ffffff88)

时间:2019-06-22 16:21:58

标签: c++ pointers casting char int

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语言标准)。我想念什么?

1 个答案:

答案 0 :(得分:1)

char用于存储字符,而不是数字值,因此可以根据实现对其进行签名或不签名

  • 在ARM char is usually an unsigned type上,因为it's more efficient,因此将char强制转换为int导致零扩展名
  • 在其他任何地方,char在默认情况下都是带符号的类型,因此这些字节将被签名扩展为int。由于0x88和0xf0为负,因此它们的高位只有一位。

解决方案是避免使用char,而改用signed charunsigned char,或者通过添加选项来更改char的符号(gcc中的-funsigned-char)来解决。甚至更好,请使用固定宽度类型,例如uint8_tint8_t

请参见