这里我想打印从文件中读取的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都有一个字节&#34; 0xab&#34;
输出结果为:&#34; ffffffab&#34;
但是如果我在ch&#34; cout&lt;&lt;之前添加(unsigned char) hex&lt;&lt; (int)(unsigned char)ch&lt;&lt; ENDL;&#34;我有这个输出:&#34; ab&#34;
为什么会这样?这些&#34; ffffff&#34;从我的第一次输入?为什么他们不在第二个?
答案 0 :(得分:3)
通常,char
是-128到127(8位)之间的带符号数。当您在文件中看到ab
时,这代表two's complement个数字。由于第一位是1,因此将其视为负数。当你把它转换为int
时,它会被“符号扩展”到32位,前加1位(这是所有f
来自的地方,因为这是所有1的十六进制数字)。当您第一次将其强制转换为unsigned char
时,它会被重新解释为0到255之间的数字,因为它现在被解释为正数,转换为int
前置0,这是隐藏的默认值。
答案 1 :(得分:0)
这取决于编译器设置,但在大多数情况下,没有限定符的char
在默认情况下被解释为已签名。
您的char
值0xAB (171)
现在具有值0xAB (-85)
,当提升为int
时会变为0xFFFFFFAB