【问题标题】:How to print 1 byte with printf?如何用 printf 打印 1 个字节?
【发布时间】:2017-05-29 01:04:51
【问题描述】:

我知道当使用%xprintf() 时,我们会从堆栈中打印4 个字节(一个十六进制的int)。但我只想打印 1 个字节。有没有办法做到这一点?

【问题讨论】:

  • 你应该标记语言。这是 C 吗?
  • 您的假设不正确。 printf("%x", x) 以十六进制形式打印 x 的值。 x 的大小假定为 (int) 类型,但不一定是 4 个字节。
  • 我添加了 C 标签。我认为我的回答是正确的,如果不是,请投反对票。
  • 只有一个字节你能详细说明一下吗?它是char 变量吗?还是您只想打印较大变量的一个字节?

标签: c printf format-specifiers


【解决方案1】:

您需要小心如何执行此操作以避免任何未定义的行为

C 标准允许您将int 转换为unsigned char,然后使用指针算法打印您想要的字节

int main()
{
    int foo = 2;
    unsigned char* p = (unsigned char*)&foo;
    printf("%x", p[0]); // outputs the first byte of `foo`
    printf("%x", p[1]); // outputs the second byte of `foo`
}

请注意,p[0]p[1] 在显示输出之前会转换为更宽的类型(int)。

【讨论】:

  • 不错。建议使用分隔符,不要将输出混合在一起。唯一的角落问题是罕见的sizeof(int) == 1。也许使用for (size_t i = 0; i< sizeof foo; i++) printf("%x\n", p[i]); 打印所有字节 - 即使只有 1 个。
【解决方案2】:

如果要打印存在于较大值类型中的单个字节,可以屏蔽和/或移出所需的值(例如 int x = 0x12345678; x & 0x00FF0000 >> 16)。或者只是通过使用(无符号)字符指针和偏移量转换所需的字节位置来检索所需的字节。

【讨论】:

    【解决方案3】:

    假设:你想打印一个1字节宽的变量的值,即char

    如果您有一个char 变量,比如char x = 0;,并且想要打印该值,请使用%hhx 格式说明符和printf()

    类似

     printf("%hhx", x);
    

    否则,由于默认参数提升,像这样的声明

      printf("%x", x);
    

    也是正确的,因为printf() 不会从堆栈 中读取sizeof(unsigned int)x 的值将根据它的类型被读取并且它将被提升为无论如何都是必需的类型。

    【讨论】:

    • 或者%02hhx如果你想打印固定宽度的前导0
    【解决方案4】:

    您可以使用以下解决方案打印一个带有printf的字节:

    unsigned char c = 255;
    printf("Unsigned char: %hhu\n", c);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-04
      • 1970-01-01
      • 2011-07-27
      • 1970-01-01
      相关资源
      最近更新 更多