【问题标题】:Cast int into an array of two bytes将 int 转换为两个字节的数组
【发布时间】:2017-05-04 09:31:39
【问题描述】:

我是一名 Java 程序员,我尝试使用两种不同的方式将字节打印到标准输出中。

unsigned char bytes[2];
//...
printf("%x%x", bytes[0], bytes[1]);
std::cout << bytes[0] << bytes[1];

但是这些方法的输出是不同的。为什么?如何使 printf 输出与std::cout 一样?

【问题讨论】:

  • 您的 printf 调用正在打印小写十六进制(%x),而 cout 调用正在打印 char 值。
  • bytes 中有什么内容?

标签: c++ stdout


【解决方案1】:

std::cout 将被打印为字符。

printf 发生整数提升,它们作为ints 传递,%x 说明符告诉printf 以十六进制格式打印unsigned int

您可以使用%cprintf 打印一个字符,或者您可以通过自己进行促销并设置hex 标志让std::cout 将其打印为十六进制:

std::printf("%c%c", bytes[0], bytes[1]);
std::cout << std::hex << +bytes[0] << +bytes[1];

【讨论】:

    【解决方案2】:

    %x以十六进制CS输出一个数字,例如code

    int x = 80;
    printf("%x", x);
    

    将打印50

    要以十进制形式写入数字,您必须使用%d。此外,要以数字而非字符的形式打印 char 变量,您必须将其转换为 int

    unsigned char bytes[2];
    //...
    printf("%d%d", bytes[0], bytes[1]);
    std::cout << (int)bytes[0] << (int)bytes[1];
    

    【讨论】:

    • 又不一样了
    • 在我的计算机上,这段代码打印出相同的行(事实上,它们打印在一行上,但无论如何它们是相同的)。你的箱子里印的是什么?
    • @St.Antario:数组中有什么?
    【解决方案3】:

    相当于:

    #include <iomanip>  // needed for std::hex
    
    std::cout << std::hex << static_cast<unsigned int>(bytes[0]) << static_cast<unsigned int>(bytes[1]);
    

    两个区别:

    • 您的 printf%x 以十六进制打印 - 对于 C++ 流,std::hex 用于此
    • 您的printf 采用int 值(用于%x),但C++ 流没有将unsigned char 打印为整数值的operator&lt;&lt;(而是将其打印为字符),因此您需要先将 unsigned char 转换为整数类型(例如,unsigned int 如上面的代码所示)

    【讨论】:

      猜你喜欢
      • 2011-09-04
      • 1970-01-01
      • 2010-10-22
      • 1970-01-01
      • 2023-03-03
      • 2022-06-20
      • 1970-01-01
      相关资源
      最近更新 更多