【问题标题】:C - display char as hexC - 将字符显示为十六进制
【发布时间】:2016-06-28 05:04:59
【问题描述】:

我想以十六进制打印字符的 ASCII 码;例如,对于

char a = 0xA5;

我想在控制台上打印A5。这是我尝试过的:

char a = 0xA5;
printf("%02X", a);

但我得到FFFFFFA5。我该如何解决这个问题?

【问题讨论】:

  • "%02hhX" 应该在 C99 或更高版本的编译器上执行此操作。当然是骗子。
  • @chux 谢谢它的工作原理!

标签: c char hex printf


【解决方案1】:

将值转换为 unsigned char,然后再次转换为 unsigned int 以通过 %X 打印。

char a = 0xA5;
printf("%02X", (unsigned int)(unsigned char)a);

请注意,转换为无法存储原始值的有符号整数是实现定义的,但根据N1256 6.3.1.3 定义了转换为无符号整数

【讨论】:

  • (unsigned int) 不需要。 C11 §6.5.2.2 6“行为未定义,但以下情况除外:- 一种提升类型是有符号整数类型,另一种提升类型是相应的无符号整数类型,并且值在两种类型中都是可表示的”跨度>
  • 是的——当然。案例 1:char 已签名。 (unsigned char)a 并适合 int。根据“ §6.5.2.2 6”,适用,因为它也适合unsigned。 (可能想阅读整个段落。案例 2:char 已签名。(unsigned char)a 不适合 intunsigned%X 没问题。案例 3 char 未签名,并且适合int。-类似于案例1。案例4:char 未签名并适合unsigned。显然没有问题。案例1 可能是唯一可能无法说服您的案例。如果没有,也许发布一个问题?这一切都集中在 §6.5.2.2 6
  • @chux 有些人认为%X 是未定义的,除非参数的类型正好是unsigned int。毕竟,标准确实是这么说的。 (我的观点是标准有缺陷,你应该可以在这里使用unsigned char
  • 是的,它确实这么说 - 在一个部分。该标准是600+页,必须作为一个整体。 “参数的类型完全是无符号整数”是有问题的,因为狭窄的参数经历了通常的提升。 C11 §6.5.2.2 6 详细说明了一个异常,该异常允许在 intunsigned 中可表示的提升值的行为相同,无论是 "%d""%X""%o" 等。
【解决方案2】:

“问题”被称为符号扩展——默认情况下参数作为 int 传递,因此 char 将转换为 int,在此过程中符号扩展意味着添加了额外的 f——使 char 无符号这个

unsigned char a = 0xA5;
printf("%02X", a);

编译器将了解如何处理您的数据。

【讨论】:

    猜你喜欢
    • 2018-01-31
    • 1970-01-01
    • 2019-02-21
    • 2011-05-17
    • 2012-09-13
    • 2014-11-03
    • 1970-01-01
    • 2017-08-12
    • 2018-01-22
    相关资源
    最近更新 更多