我来自this question,我想在一个字节中写入2个整数,并保证其介于0-16之间(每个4位)。现在,如果我关闭文件,并运行另一个读取以下内容的程序...。for (int i = 0; i < 2; ++i){ char byteToRead; file.seekg(i, std::ios::beg); file.read(&byteToRead, sizeof(char)); bool correct = file.bad(); unsigned int num1 = (byteToRead >> 4); unsigned int num2 = (byteToRead & 0x0F);}问题是,有时这可行,但是其他时候我让第一个数字为负,而第二个数字一直都是10或9,而它们肯定不是我写的数字!因此,例如,这里的前两个数字有效,而下一个数字无效。例如,上面读取的输出将是:At byte 0, num1 = 5 and num2 = 6At byte 1, num1 = 4294967289 and num2 = 12在字节1,num1应该为9。似乎12写得很好,但9 byteToWrite -100 'œ''我检查了this question,它也有类似的问题,但我觉得我的字节序就在这里。 最佳答案 右移运算符保留最左边的位的值。如果最左位在移位前为0,则移位后仍为0;如果为1,则移位后仍为1。这样可以保留值的符号。在您的情况下,您将9(0b1001)与12(0b1100)组合在一起,因此您写入0b10011100(0x9C)。 #7位为1。当byteToRead右移时,您将获得0b11111001(0xF9),但是它隐式转换为int。从char到int的转换也保留该值的符号,因此产生0xFFFFFFF9。然后,隐式int被隐式转换为无符号int。因此num1包含0xFFFFFFF9,即4294967289。有两种解决方案:进行右移时将byteToRead强制转换为无符号字符;对移位结果应用掩码,以仅保留所需的4位。关于c++ - 二进制文件写入后读取负整数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26557202/
10-11 23:20
查看更多