【问题标题】:Format specifier %02x格式说明符 %02x
【发布时间】:2013-08-28 15:17:12
【问题描述】:

我有一个简单的程序:

#include <stdio.h>
int main()
{
        long i = 16843009;
        printf ("%02x \n" ,i);
}

我正在使用 %02x 格式说明符来获得 2 个字符输出, 但是,我得到的输出是:

1010101 

虽然我希望它是:01010101

【问题讨论】:

    标签: c printf format-specifiers


    【解决方案1】:

    %x 是格式化和输出十六进制值的格式说明符。如果您提供 int 或 long 值,它会将其转换为十六进制值。

    %02x 表示如果您提供的值小于两位数,则将在前面添加 0

    您提供了值16843009,它已转换为1010101,这是一个十六进制值。

    【讨论】:

      【解决方案2】:

      你实际上得到了正确的值。

      您的x86(兼容)处理器存储这样的数据的方式是Little Endian顺序,这意味着MSB在您的输出中是最后的。

      所以,鉴于你的输出:

      10101010

      最后两个十六进制值10 是最高有效字节(2 hex digits = 1 byte = 8 bits(用于(可能不必要的)澄清)。

      因此,通过反转字节的内存存储顺序,您的值实际上是:01010101

      希望能解决这个问题!

      【讨论】:

      • 呃,不,printf 没有将 MSB 打印到右侧,那会很混乱
      • 除了 eckes 所说的,大多数处理器内部的位编号并不是真正的事情,因为您通常一次处理一个字节。位顺序仅对序列化很重要。字节序(大或小)是字节顺序,而不是位顺序。
      【解决方案3】:

      %02x 表示至少打印 2 位数字,如果少的话,在前面加上 0's。在您的情况下,它是 7 位数字,所以前面没有多余的 0

      另外,%x 用于 int,但你有一个 long。请改用%08lx

      【讨论】:

      • 我了解到 '%x' 中的 'x' 指的是十六进制格式,而不是 int。是这样吗?
      • x 指的是“十六进制格式的整数”,而不是“十进制格式的整数”d。两者都接受 int 作为要打印的值。 lxld 都接受 long
      • "两者都接受 int 作为要打印的值" --> 嗯,"%x" 是用于 unsigned,而不是 int。足够常见以至于int “有效”,即使 C 没有指定。
      【解决方案4】:

      您的字符串比格式宽度 2 更宽。因此无需进行填充。

      【讨论】:

        猜你喜欢
        • 2014-06-22
        • 1970-01-01
        • 1970-01-01
        • 2016-02-13
        • 1970-01-01
        • 1970-01-01
        • 2017-11-16
        • 2013-02-13
        • 1970-01-01
        相关资源
        最近更新 更多