我最近读到
unsigned char x=1;
printf("%u",x);
调用未定义的行为,因为由于格式说明符 %u,printf 需要一个无符号整数。但我仍然想了解这个例子中发生了什么。
我认为积分提升规则适用于由 .printf("%u",x)
表示的表达式和值x
。
A.6.1 积分促销
一个字符、一个短整数或一个整数位域,无论是否有符号,或枚举类型的对象,都可以在可以使用整数的表达式中使用。如果一个 int 可以表示原始类型的所有值,则将该值转换为 int;否则,该值将转换为 unsigned int。这个过程称为积分提升。
这里的“可以使用”是什么意思?这是否意味着“语法正确”或“已定义行为”?
在这个例子中 x 是如何提升的?我读过它被提升为int,但如果printf("%u", (int x))
仍然是未定义的行为,那么我真的不明白为什么......