char溢出~125 +

时间:2016-03-20 00:15:18

标签: c++ char

长程序短路:我正在逐字节地读取二进制文件,在每个读取字节之后,我输出该字节但不作为字符(因为我声明了变量char c并将值存储在那里)但是作为{ {1}}。当我得到大约125以上的二进制值时,我得到值为负值。

例如,当我阅读int = hex 89并将此字符输出为dec 137时,我获得了值int

另一个例子:我看了-119 = hex 83,我将此字符输出为dec 131,我得到了值int

我按字节读取此文件:

-125

2 个答案:

答案 0 :(得分:1)

我想你想问一下,当你预期为正时,为什么会看到负值。

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

其次,char在C ++中可能也可能不是signed(有关详细信息,请参阅this question)。您的char似乎是signed char。这意味着它可以表示(-128,127)范围内的数字,并将127以上的字节值解释为负数。这就是为什么你认为它们是负面的(C ++会将(char) -119转换为(int) -119)。如果您想要正值,请将c声明为unsigned char(或unsigned int)。

答案 1 :(得分:0)

首先要说的是标准不能保证charsigned - 这是系统和实现特定的。然后,你不应该使用unsigned来执行这样的任务,因为即使它工作正常(这不是你的情况),当你使用不同的编译器或不同的系统时它可能会中断。

要说的第二件事是你不应该使用C风格的演员表,而是使用char。 C风格的演员阵容不安全,并且在他们简单的语法下有很多复杂性。

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

unsigned int