假设我想打印 unsigned char
:
unsigned char x = 12;
哪个是正确的。 这个是:
printf("%d",x);
或者这个:
printf("%u",x);
我在其他地方看到了这样的讨论:
- 即使将 ch 改为 unsigned char,代码的行为也不符合 C 标准的规定。这是因为在普通的 C 实现中,unsigned char 被提升为 int,因此一个 int 会被传递给 printf 的 %u 指示符。但是,%u 需要一个 unsigned int,所以类型不匹配,C 标准没有定义这种行为。
- 你的评论是不正确的。C11 标准规定转换指示符必须与函数参数本身的类型相同,而不是推广类型。这一点在 hh 长度修改符的描述中也有明确说明:“根据整数提升,参数已被提升,但其值在打印之前必须转换为 signed char 或 unsigned char”。
那么哪个是正确的?有什么可靠的来源关于这个问题吗?(从这个意义上讲,我们也应该使用 %d 打印 unsigned short int,因为它可以升级为 int?)
d
可能会导致未定义行为,请参见讨论(请查看我的最新评论):https://dev59.com/5ZXfa4cB1Zd3GeqPh6IZ#36350763。我想听听你的意见。 - 2501char
、unsigned char
、signed char
...int
、unsigned
时,请考虑什么是 defined 并从2个规范开始:(1)任何低于int/unsigned
的较低级整数将被提升为int/unsigned
。 (2)...
参数:“...一个提升类型是有符号整数类型,另一个提升类型是相应的无符号整数类型,并且该值在两种类型中都可以表示”(C11 §6.5.2.2)。因此,在考虑是否使用printf()
定义"hhd"、"hhu"、..."d"、"u"
时,原始类型不相关,只关注提升类型和值。 - chux - Reinstate Monicaint
参数(或在int
范围内的unsigned
参数),其值是在int
、short
、signed char
范围内;B)使用具有unsigned
参数(或在unsigned
范围内的int
参数)且值为任何值的“...u”、“...o”、“...x”、“...X”。我认为像A)中值超出范围的情况取决于实现。 - chux - Reinstate Monica