3

sprintf在 C 中是否有一个格式说明符将 a 映射char到十六进制,其方式与%x将 an 映射int到十六进制的方式相同?

4

2 回答 2

9

是和不是。

由于sprintf采用可变参数列表,因此所有参数在sprintf接收它们之前都会经过默认提升。这意味着sprintf永远不会收到char- a将始终在收到它之前char被提升为(以及遗嘱)。intsprintfshort

是的,由于sprintf接收的是int,您可以使用%x它来将其转换为十六进制格式,并且无论该值以 、 还是 开头,它的工作方式charshort相同int。如果(通常情况下)您想为每个输入打印 2 个字符,您可以使用%2.2x.

但要注意一点:如果您char已签名,并且您从负值开始,则提升int将产生相同的数值,这通常不会与原始字符的位模式相同,因此(例如)一个字符如果是 16 位,如果 int 是 32 位,或者if是 64 位(假设有符号整数的典型 2 的补码表示),该值-1通常会打印出来。ffffintffffffffffffffffffffffffint

于 2012-10-03T03:24:50.090 回答
7

那是一样的%x。所有charint在传递给sprintf(或任何其他接受可变数量参数的函数)之前都会转换为。

printf("%x\n", 'a');

印刷61

于 2012-10-03T03:13:55.430 回答