我是Java程序员,我尝试使用两种不同的方式将字节打印到stdout。
unsigned char bytes[2];
//...
printf("%x%x", bytes[0], bytes[1]);
std::cout << bytes[0] << bytes[1];
但这些方法的输出是不同的。为什么?如何使printf输出与std::cout
相同?
答案 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
,如上面的代码所示)