1 字节整数不转换 I/O 格式

1 byte integer doesn't convert i/o formats

本文关键字:格式 转换 字节 整数      更新时间:2023-10-16

我写了下面的代码,它以十六进制格式输入一个数字并以十进制形式输出:-

#include<iostream>
#include<iomanip>
#include<stdint.h>
using namespace std;
int main()
{
  uint8_t c;
  cin>>hex>>c;
  cout<<dec<<c;
  //cout<<sizeof(c);
  return 0;
}

但是当我输入 c(十六进制表示 12)时,输出再次是 c(而不是 12)。有人可以解释一下吗?

这是因为uint8_t通常是unsigned chartypedef。 所以它实际上是将'c'读作 ASCII 0x63 .

请改用int

#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
    int c;
    cin>>hex>>c;
    cout<<dec<<c<<'n';
    return 0;
}

程序输出:

$ g++ 测试.cpp$ ./a.outC12

这是uint8_t实际上是unsigned char这一事实的不幸副作用。因此,当您存储 c 时,它存储的 ASCII 值为 c(99 十进制),而不是数值 12。

uint8_tunsigned char的别名,不幸的是ostream尝试将其输出为字符。这已在 C++20 std::format中修复:

#include <format>
#include <iostream>
#include <stdint.h>
int main() {
  uint8_t n = 42;
  std::cout << std::format("{}", n);
}

输出:

42