【问题标题】:format specifier for printing bit field in a structure in hexa decimal format in c用于在 c 中以十六进制格式打印结构中的位字段的格式说明符
【发布时间】:2014-12-09 07:41:38
【问题描述】:

我有以下结构

struct data {
    uint64_t addr:50;
};

如果我想以十六进制格式打印addr 的值,我应该使用哪个格式说明符?

【问题讨论】:

  • 使用%x 说明符有什么问题吗?但是,它不会为您提供 bitfield 变量的 exact 值。它会考虑datatype。也许您可以在打印之前使用mask 过滤所需的位。
  • 50 位值没有格式说明符。你必须自己做。
  • 或者......根本不使用位字段,使用 uint64_t。请注意,位字段不能可靠地用于任何东西,而是作为一大块布尔标志的容器。例如,see this

标签: c formatting printf bit-fields


【解决方案1】:

您应该分两步完成:首先,使用addr 的副本创建一个完整的uint64_t 变量,然后使用"%" PRIx64 打印它。

【讨论】:

  • 不,你不能假设unsigned long%lx 期望的类型)是uint64_t。打印uint64_t 的正确方法是使用"%" PRIx64
  • 太棒了。我会留下我的评论,因为即使我提到的代码不再存在,它也会提供一些信息。
  • 为什么不用"%" PRIx64 说明符直接打印呢?位域的类型为uint64_t,正如我们在static_assert 中看到的那样... 为什么首先需要一个副本?我注意到的唯一问题是 if 位字段足够小以适应较低的类型(如 32 位或更少,这将适合 unsigned int)然后带有 -Wformat 的 Clang 发出一个警告应该使用%u 时使用%lu。不幸的是,使用%u 会在 GCC 上发出相反的警告。我最终在printf 中使用了明确的static_cast<uint64_t>。有趣的是,这不会在 GCC 中触发 -Wuseless-cast...
  • @AdamBadura:你问为什么要复制,然后你说你使用static_cast<uint64_t>。那就是复制。当然这很好,与格式化相比,这个副本并不慢。
  • @JohnZwinck,我在写完评论后意识到自己...... :) 但还有更多内容。我们拥有的static_cast 只是为了让 Clang (-Wformat) 静音,它显然注意到位字段“太小”并将其视为unsigned int 而不是uint64_t(在我们的例子中恰好是unsigned long )。 GCC 不会发出这样的警告,我们可以(我猜?)在没有static_cast 的情况下逃脱。
猜你喜欢
  • 2015-12-31
  • 1970-01-01
  • 1970-01-01
  • 2015-09-17
  • 1970-01-01
  • 1970-01-01
  • 2020-05-14
  • 2012-01-11
  • 1970-01-01
相关资源
最近更新 更多