【问题标题】:C printf integer type U32C printf 整数类型 U32
【发布时间】:2013-01-16 10:31:45
【问题描述】:

我有十六进制值 0x5a800000000b,我正在尝试在 C 中获取 printf 语句以将其打印到控制台。

到目前为止(因为我在 C 语言中毫无用处)我能够使用以下语法打印“b”:

printf("Hex value%x\n", value);

该值存储在整数类型 U32 中,但在尝试了 %llx、%lx 的所有不同组合后,我只是不断收到编译器警告。

我猜我的 printf 语法有误,但我似乎找不到正确的 % 选项,有人可以帮帮我吗?

谢谢

【问题讨论】:

  • 你试过%ulx%ullx吗?

标签: c integer printf


【解决方案1】:

printf 没有问题。

问题是 32 位变量不能保存值 0x5a800000000b。 32 位只能保存 8 个十六进制数字:0x0000000b。因此b 输出。

要存储这么大的值,您应该使用 64 位变量。

long long value = 0x5a800000000bLL

还要注意末尾的双 L。它告诉编译器这个常量也是一个long long

那么你可以在printf格式字符串中使用%llx

【讨论】:

  • 啊,是的,当然!我对 printf 太着迷了,我忘了检查实际值有多大 :) 谢谢 Didier!
【解决方案2】:

这些类型有一些预定义的宏:

#include <inttypes.h>
int64_t PRId64. PRIi64
int32_t PRId32, PRIi32
int16_t PRId16, PRIi16
int8_t PRId8, PRIi8

例如:

printf("%"PRId32"\n", my32Int);

【讨论】:

  • 糟糕,它应该是 PRId64。谢谢!
  • 虽然这个问题是 C 并且在 C 中以这种方式使用 inttypes 宏没有问题,但由于预处理器在 C++ 中的工作方式,在这些宏和字符串文字之间包含空格可能是一个好习惯。如果没有任何空格,预处理器将不会应用 inttypes 宏,因为它会将其识别为使用用户定义的文字。
【解决方案3】:

值 0x5a800000000b 超过 32 位,因此您必须使用 long

long value = 0x5a800000000bl;
printf("Hex value%lx\n", value);

请注意,十六进制常量应以l,.结尾。

【讨论】:

  • @dbrank0 - 取决于编译器/环境。
  • 要独立于平台,这种情况下使用uint64_t即可。
猜你喜欢
  • 1970-01-01
  • 2020-04-24
  • 2021-03-23
  • 2014-02-08
  • 2021-07-28
  • 2015-06-26
  • 1970-01-01
  • 2023-04-03
  • 2021-11-23
相关资源
最近更新 更多