首页 文章

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

提问于
浏览
0

在这里,我想打印从文件中读取的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 回答

  • 3

    通常, char 是-128到127(8位)之间的带符号数 . 当您在文件中看到 ab 时,这表示two's complement数字 . 由于第一位是1,因此将其视为负数 . 当你把它转换为 int 时,它是"sign extended"到32位,通过前置1位(这是所有 f 来自的地方,因为这是所有1的十六进制数字) . 当您第一次将其强制转换为 unsigned char 时,它会被重新解释为0到255之间的数字,因为它现在被解释为正数,转换为 int prepends 0s,默认情况下是隐藏的 .

  • 0

    它取决于编译器设置,但在大多数情况下, char without qualifier在默认情况下被解释为signed .

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

相关问题