2016-03-13 120 views
0

我想打印十六进制字符的ASCII码;例如,对于C - 显示字符为十六进制

char a = 0xA5; 

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

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

但我得到FFFFFFA5。我怎么能解决这个问题?

+0

'“%02hhX”'应在C99或更高版本的编译器上执行。当然是一个骗局。 – chux

+0

@chux感谢它的工作! –

回答

1

“问题”被称为符号扩展 - 参数默认作为int传递,因此char将被转换为int,并且在该过程中,符号扩展将意味着多余的f被添加 - 使char无符号像这样

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

并且编译器会理解如何处理您的数据。

2

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

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

注意,转化为带符号的整数,其不能够存储原始值是实现定义的,但被定义转换成无符号整数,根据N1256 6.3.1.3

+0

'(unsigned int)'不需要。 C11§6.5.2.26“的行为是未定义的,除了以下情况: - 一个提升类型是有符号整数类型,另一个提升类型是对应的无符号整数类型,并且该值可以在两种类型中表示” – chux

+0

是 - 当然。情况1:'char'被签名。 '(unsigned char)a'并且适合'int'。根据“§6.5.2.26”适用,因为它也适用于'unsigned'。 (可能需要阅读整个段落)case 2:'char'有符号'(unsigned char)a',不适合'int'但是'unsigned'。'%X'没有问题case 3'char '是无符号的,并且符合'int'。 - 像情况1一样。情况4:'char'是无符号的并且符合'unsigned'。显然没有问题,情况1可能是唯一一个不能说服你的。不是,也许发布一个问题?它都集中在§6.5.2.26 – chux

+0

@chux有些人认为'%X'是未定义的,除非参数的类型完全是'unsigned int'。毕竟,标准确实会说(我的观点是标准是有缺陷的,你应该可以在这里使用'unsigned char') –

相关问题