ifstream::read 不断返回不正确的值

ifstream::read keeps returning incorrect values

本文关键字:不正确 返回 read ifstream      更新时间:2023-10-16

我正在尝试读取.bin文件并返回十六进制值。一切正常,直到它必须读取"F0"或"A0"等值。它不断返回"fffff0"或"ffffa0"。当我修改函数以返回十进制值时,控制台显示"-16"和"-96",而所有其他正确的返回值均为正值。

void reader(string input) { 
int size;
char *storage;
ifstream file(input, ios::in | ios::binary);
if (file.is_open()) {
    file.seekg(0, ios::end);
    size = file.tellg();
    storage = new char[size];
    file.seekg(0, ios::beg);
    file.read(storage, size);
    file.close();
    for (int i = 0; i < size; i++) 
    {
        cout << hex << (int)storage[i] << endl;
    }
}
else {cout << "could not open file" << endl;}
}
">

char"是一个有符号值。当设置字符的顶部位时,它表示负值(例如0x80到0xFF(。当您将负值转换为不同大小的整数时,该值将被保留,从而导致十六进制中的值不同。

#include <iostream>
int main()
{
    char ch = 0xF0;
    int value = ch;
    std::cout << value << std::endl;
    std::cout << std::hex << value << std::endl;
}

上面的程序打印"-16,fffffff0"。该程序实际上等效于:

#include <iostream>
int main()
{
    char ch = -16;
    int value = ch;
    std::cout << value << std::endl;
    std::cout << std::hex << value << std::endl;
}

要获得预期行为,您需要屏蔽该值:

#include <iostream>
int main()
{
    char ch = 0xF0;
    int value = ch & 0xFF;
    std::cout << value << std::endl;
    std::cout << std::hex << value << std::endl;
}