字符溢出在 ~125+

char overflow at ~125+

本文关键字:125+ 溢出 字符      更新时间:2023-10-16

长程序简短:我正在逐个字节读取二进制文件,每次读取字节后,我输出此字节但不作为字符输出(因为我char c声明了一个变量并将值存储在其中),而是作为int。当我来到上面 125 左右的二进制值时,我得到的值为负值。

例如,当我读取 hex 89 = dec 137 并将此字符输出为 int 时,我得到的值-119

再举个例子:我读hex 83 = dec 131,我输出这个字符作为int,我得到值-125

我按字节读取此文件:

ifstream inFile;
inFile . open( srcName, ios::binary | ios::in );
char c;
while( inFile . get( c ) ){
  inFile . get( c );
  cout << (int) c << endl;
}

我想你想问为什么当你期望为正值时你会看到负值。

首先,不应将数据从文件读取到char中。在 C 和 C++ 中,从文件或标准输入(getchar()fgetc()ifstream::get()等)中读取字符的函数返回一个int。原因是需要检测文件(或输入)的结尾。该函数需要返回一些可以检查的值,并且与任何可能的字节 (char) 值不同 - 在二进制文件中,您可以遇到具有任何值的字节。

其次,char可能会也可能不会signed C++(有关更多详细信息,请参阅此问题)。你的char似乎是一个signed char.这意味着它可以表示 (-128,127) 范围内的数字,并将超过 127 的字节值解释为负数。这就是为什么您将它们视为负数(C++会将(char) -119转换为(int) -119)。如果需要正值,请将c声明为 unsigned char(或 unsigned int )。

首先要说的是,标准不能保证char signedunsigned - 这是特定于系统和实现的。然后,您不应该将char用于此类任务,因为即使它工作正常(不是您的情况),当您使用不同的编译器或不同的系统时,它也可能会中断。

第二要说的是,你不应该使用 C 样式的强制转换,而应该使用 static_cast 来代替。C 样式的强制转换并不安全,并且在其简单的语法下有很多复杂性。

要解决您的问题,您可以使用unsigned char而不是char。如果由于某种原因这是不可能的 - 您可以尝试在(隐式)强制转换为unsigned int之前进行unsigned char,如下所示:

unsigned int val = static_cast<unsigned char>(a);