【问题标题】:Hexadecimal representation of char read from file从文件中读取的字符的十六进制表示
【发布时间】:2014-03-14 15:34:50
【问题描述】:

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

所有输入文件都是一个字节0xab

输出为:ffffffab

但是如果我在 ch cout &lt;&lt; hex &lt;&lt; (int) (unsigned char) ch &lt;&lt; endl; 之前添加 (unsigned char) 我有这个输出:ab

为什么会这样?这些ffffff 在我的第一个输入中来自哪里?为什么他们不在第二个?

【问题讨论】:

  • 在 C 中(我假设在 C++ 中相同)8 位 signed char 的上限值为 127,十六进制值 0xab 的值 171 大于 127,所以将其读入 8 位 signed char 是未定义的行为。

标签: c++


【解决方案1】:

通常,char 是介于 -128 和 127(8 位)之间的有符号数。当您在文件中看到ab 时,这表示two's complement 数字。由于第一位是 1,因此将其视为负数。当您将其转换为int 时,它通过添加 1 位“符号扩展”到 32 位(这是所有 fs 的来源,因为这是所有 1 的十六进制数字)。当您第一次将其转换为 unsigned char 时,它会被重新解释为 0 到 255 之间的数字,因为它现在被解释为正数,转换为 int 会添加 0,默认情况下是隐藏的。

【讨论】:

    【解决方案2】:

    这取决于编译器设置,但在大多数情况下,不带限定符的 char 默认被解释为已签名。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-02
      • 1970-01-01
      • 2011-12-06
      • 2016-11-04
      • 2014-02-25
      • 2015-12-09
      相关资源
      最近更新 更多