从文件读取的char的十六进制表示

时间:2014-03-14 15:34:51

标签: c++

这里我想打印从文件中读取的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;从我的第一次输入?为什么他们不在第二个?

2 个答案:

答案 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在默认情况下被解释为已签名。

您的char0xAB (171)现在具有值0xAB (-85),当提升为int时会变为0xFFFFFFAB

相关问题