我最近读到
unsigned char x=1;
printf("%u",x);
由于格式说明符%u,printf函数期望一个无符号整数,因此调用未定义的行为。但我仍然希望了解这个示例中发生了什么。
我认为在表达式printf("% u",x)
和x
所表示的值中应用整数提升规则。
A.6.1整数提升
字符、短整型或整型位域,都可以是有符号的也可以是无符号的,或者是枚举类型的对象,都可以在表达式中使用整数。如果int类型可以表示原始类型的所有值,则将值转换为int类型;否则将值转换为无符号int类型。此过程称为整数提升。
这里的“可以使用”是什么意思?它是指“语法上正确”还是“已定义的行为”?
那么在这个例子中如何提升x的类型?我读到过它被提升为int,但是如果printf("%u", (int x))
仍然是未定义行为,那么我就真的不明白为什么了...
char
且实现隐式为有符号,那么他所说的是正确的。但这里你使用的是unsigned char
,所以一切都在范围内。 - luser droog