C++ 字符,十六进制,因为它显示ffffff

C++ 字符,十六进制,因为它显示ffffff,c++,C++,我有一个char[],带有缓冲区名称,数据以二进制模式使用ifstream保存 void File::mostrarBuffer(){ for (int a = 0; a < std::strlen(buffer); a++){ std::cout << std::hex << ((int)buffer[a]) << std::endl; } // para ver char test, only for test

我有一个char[],带有缓冲区名称,数据以二进制模式使用ifstream保存

void File::mostrarBuffer(){
  for (int a = 0; a < std::strlen(buffer); a++){
    std::cout << std::hex << ((int)buffer[a]) << std::endl;
  }
  // para ver char test, only for test                                                              
  std::cout <<  "==="  << std::endl;

  for (int a = 0; a < std::strlen(buffer); a++){
    std::cout <<  buffer[a] << std::endl;
  }

  char charTest = '\211';

  std::cout <<  "==="  << std::endl;

  std::cout << std::hex << (int)charTest  << std::endl;
  std::cout << std::hex << (int)buffer[0] << std::endl;
}
hextump(“little endian”)中的文件:

我的问题是,为什么会出现ffffff89而不是89,而且只有在char[]的第一个元素上,我一直在处理这个问题,但找不到解决方案。谢谢你的阅读

此解决方案适用于我:

 std::cout << std::hex << ((unsigned int)(unsigned char)buffer[a]) 
           << std::endl;

std::cout因为您的
char
s已签名(设置了最高位)


很抱歉,我不熟悉如何使用
std::hex
,但您需要将其视为无符号字符值。尝试将
char
强制转换为和未签名类型。

因为您的
char
已签名(设置了最高位)


很抱歉,我不熟悉如何使用
std::hex
,但您需要将其视为无符号字符值。尝试将
char
强制转换为和无符号类型。

您使用的
char
显然是在编译器中签名的,如果设置了顶部位(符号位),则强制转换将进行符号扩展。您使用的
char
显然是在编译器中签名的,如果顶部位(符号位)设置后,强制转换将执行符号扩展。除非先将
char
强制转换为
unsigned char
,否则强制转换为
unsigned char
,否则不应更改任何内容。使用
std::cout
std::hex
是一个I/O操纵器:将其转换为流将整数到字符串转换的基数更改为16。由于这是一个永久性的副作用,因此应始终首先移位
std::dec
,以便在输出时将数字转换为十进制表示。还有其他类似的操纵器也有同样的问题。这本应取代
printf
格式规范,但它有更糟糕的缺点,介于无望的损坏和FUBAR之间。感谢这是解决方案,我认为,这并不是说它更难,如果适应c++或询问stackoverflow,那么愚蠢的问题就是收到你的反对票,你们都花了这么多时间,我不是说你们对我很好thanks@AngelAngel当前位置有几件事可能会让你的问题变得更好,但是我真的不明白为什么它被否决了。除非先将
char
转换为
unsigned char
,否则转换为
unsigned char
不应该改变任何东西。使用
std::cout
std::hex
是一个I/O操纵器:将其转换为流会将整数到字符串转换的基数更改为16。由于这是一个永久性的副作用,因此应始终首先移位
std::dec
,以便在输出时将数字转换为十进制表示。还有其他类似的操纵器也有同样的问题。这本应取代
printf
格式规范,但它有更糟糕的缺点,介于无望的损坏和FUBAR之间。感谢这是解决方案,我认为,这并不是说它更难,如果适应c++或询问stackoverflow,那么愚蠢的问题就是收到你的反对票,你们都花了这么多时间,我不是说你们对我很好thanks@AngelAngel当前位置有几件事可能会让你的问题变得更好,但我真的不明白为什么它被否决了。
0000000 5089 474e 0a0d 0a1a 0000 0d00 4849 5244
 std::cout << std::hex << ((unsigned int)(unsigned char)buffer[a]) 
           << std::endl;