格式说明符如何在内部工作?

时间:2016-11-04 09:00:06

标签: c

考虑:

int x=0xdeadbeef;
char c=x;
printf("%x",c);

输出为ffffffef。 怎么样?为什么不是000000ef

2 个答案:

答案 0 :(得分:4)

32位整数不适合8位字符,因此char c=x;c=0xef相同。

然后显然char已在您的编译器上签名且0xef大于127,因此它会转换为某个负值,-17。

传递给printf时,负值char会提升为int,符号会被保留(这称为“默认参数提升”,并由所有可变参数函数使用) 。 32位二进制补码表示-17是ffffffef。使用%x,您使用错误的格式说明符; printf期待unsigned int。它会尝试将带符号的数字显示为无符号。

您可以将char替换为uint8_t来修复错误。

总的来说,这段代码非常值得怀疑,因为它依赖于许多指定不当的行为。您不应该溢出有符号整数,不应该使用char来存储值,您应该努力使用正确的格式说明符。

答案 1 :(得分:2)

这不是一个问题"如何格式化说明符工作"还有更多" char如何运作"。

没有任何其他类型信息的char可以是有符号值或无符号值,哪一个是编译器相关的。如果您需要特定的签名,则应使用unsigned charsigned char

%x格式指令需要unsigned int,因此(基本上)将char首先转换为int,然后将其解释为unsigned int。如果您的字符已签名,则会在转换为int时进行符号扩展,这就是您获得所看到的值的原因。