将int转换为两个字节的数组

时间:2017-05-04 09:31:39

标签: c++ stdout

我是Java程序员,我尝试使用两种不同的方式将字节打印到stdout。

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

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

3 个答案:

答案 0 :(得分:3)

使用std::cout,它们将打印为字符。

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

您可以printf使用%c打印字符,也可以std::cout将其打印为十六进制,方法是自行进行宣传并设置hex标志:

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

答案 1 :(得分:1)

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

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];

答案 2 :(得分:1)

等价物是:

#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 ++流没有operator<<打印unsigned char作为整数值(而不是它将被打印为一个字符),所以你需要先将unsigned char转换为整数类型(例如。unsigned int,如上面的代码所示)