在这里,我想打印从文件中读取的char的十六进制表示:
#include <iostream>
#include <fstream>
using namespace std;
int main() {
ifstream f("inputfile");
char ch;
f.get(ch);
cout << hex << (int) ch << endl;
f.close();
return 0;
}
所有inputfile都有一个字节“0xab”
输出是:“ffffffab”
但是如果我在ch“cout << hex <<(int)(unsigned char)ch << endl;”之前添加(unsigned char)我有这个输出:“ab”
为什么会这样?在我的第一次输入中,这些“ffffff”在哪里?为什么他们不在第二个?
2 回答
通常,
char
是-128到127(8位)之间的带符号数 . 当您在文件中看到ab
时,这表示two's complement数字 . 由于第一位是1,因此将其视为负数 . 当你把它转换为int
时,它是"sign extended"到32位,通过前置1位(这是所有f
来自的地方,因为这是所有1的十六进制数字) . 当您第一次将其强制转换为unsigned char
时,它会被重新解释为0到255之间的数字,因为它现在被解释为正数,转换为int
prepends 0s,默认情况下是隐藏的 .它取决于编译器设置,但在大多数情况下,
char
without qualifier在默认情况下被解释为signed .您的
char
值0xAB (171)
现在具有值0xAB (-85)
,当提升为int
时变为0xFFFFFFAB