字符溢出在 ~125+
char overflow at ~125+
长程序简短:我正在逐个字节读取二进制文件,每次读取字节后,我输出此字节但不作为字符输出(因为我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
signed
或unsigned
- 这是特定于系统和实现的。然后,您不应该将char
用于此类任务,因为即使它工作正常(不是您的情况),当您使用不同的编译器或不同的系统时,它也可能会中断。
第二要说的是,你不应该使用 C 样式的强制转换,而应该使用 static_cast
来代替。C 样式的强制转换并不安全,并且在其简单的语法下有很多复杂性。
要解决您的问题,您可以使用unsigned char
而不是char
。如果由于某种原因这是不可能的 - 您可以尝试在(隐式)强制转换为unsigned int
之前进行unsigned char
,如下所示:
unsigned int val = static_cast<unsigned char>(a);
- 'short int'持有的值溢出,但"自动"不会溢出?
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 大于65535的C++数组[size]引发不一致的溢出
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- C++中无符号字符溢出
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- 整数溢出,最大值为 pow(10,19)
- 获取隐式转换溢出从无符号到已签名的警告
- 使用 strcat 获取缓冲区溢出错误
- LeetCode 1:两和 - 地址清理器:堆缓冲区溢出地址
- 给定一个类型,如何派生一个泛型更广泛的类型(例如,用于溢出安全求和)?
- C++ 对象数组堆栈溢出
- 使用提升::lexical_cast捕获溢出
- C++ Unordered_set功能中的溢出
- 自定义排序函数中的堆溢出
- 使用向量的缓冲区溢出
- 有没有一种方法可以捕获进程中的堆栈溢出?C++Linux
- 如何修复此特征矩阵反演溢出错误?
- 字符溢出在 ~125+