长程序短路:我正在逐字节地读取二进制文件,在每个读取字节之后,我输出该字节但不作为字符(因为我声明了变量char c
并将值存储在那里)但是作为{ {1}}。当我得到大约125以上的二进制值时,我得到值为负值。
例如,当我阅读int
= hex 89
并将此字符输出为dec 137
时,我获得了值int
。
另一个例子:我看了-119
= hex 83
,我将此字符输出为dec 131
,我得到了值int
。
我按字节读取此文件:
-125
答案 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)
首先要说的是标准不能保证char
或signed
- 这是系统和实现特定的。然后,你不应该使用unsigned
来执行这样的任务,因为即使它工作正常(这不是你的情况),当你使用不同的编译器或不同的系统时它可能会中断。
要说的第二件事是你不应该使用C风格的演员表,而是使用char
。 C风格的演员阵容不安全,并且在他们简单的语法下有很多复杂性。
要解决您的问题,您可以使用static_cast
代替unsigned char
。如果由于某种原因这是不可能的 - 您可以尝试在char
之前({隐式)转换为unsigned char
,如下所示:
unsigned int