c - printf()是否按端序打印?

  • 本文关键字:打印 是否 printf c linux
  • 更新时间 :
  • 英文 :


我有一个小片段:

int main()
{
unsigned long long x = 0x0000000000008342;
unsigned long long * x_p = &x;
unsigned int * y_p = (unsigned int *)x_p;
unsigned int y = *y_p;
printf("y = %#.8xn", y);
}

带小端序,这是数字的存储方式。

0x00: 42 83 00 00
0x04: 00 00 00 00

但是为什么打印的不是0x00004283,而是0x00008342 ?

尾序适用于所有大于一个字节的整数类型。我不明白为什么你认为尾序只适用于你的64位整数类型,而不适用于int…这似乎是你困惑的根源。

代码的一个主要问题是unsigned int y = *y_p;是未定义的行为。什么是严格的混叠规则?因此,不能假定您的程序具有确定性行为。

如果您想实际打印存储在内存中的字节,您需要一个字节一个字节地打印:

for(size_t i=0; i<sizeof x; i++)
printf("%.2X ", ((unsigned char*)&x)[i] );

这种转换是可以的,因为字符类型是严格混叠的特殊例外。输出42 83 00 00 00 00 00 00

你也有一个轻微的美容问题:0x0000000000008342。不要像这样写前导零,以为你写了一个64位整数常量。这种类型实际上是int(32位系统)或unsigned int(8/16位系统)。前导零没有任何作用,您需要添加ull后缀。在这个特定的代码片段中,这不是问题,但如果将这种风格引入到实际的程序中,可能会成为问题。

printf("%xn", unsigned_number);将打印unsigned_number的十六进制格式,就像printf("%un", unsigned_number);的十六进制格式一样。

都与unsigned_number的内部表示无关。printf("%x",...)不做hexdump(除非你在数据的每个字符上循环调用它)。

相关内容

  • 没有找到相关文章

最新更新