【发布时间】:2023-03-23 02:52:01
【问题描述】:
我正在阅读有关常用算术转换的 C99 标准。
如果两个操作数的类型相同,则不再进行转换 需要。
否则,如果两个操作数都具有有符号整数类型或都具有 无符号整数类型,具有较小整数类型的操作数 转换等级转换为具有更大的操作数的类型 排名。
否则,如果无符号整数类型的操作数有秩 大于或等于另一个操作数的类型的等级,则 带符号整数类型的操作数转换为 无符号整数类型的操作数。
否则,如果带符号整数类型的操作数的类型可以 用无符号表示操作数类型的所有值 整数类型,然后转换无符号整数类型的操作数 为有符号整数类型的操作数的类型。
否则,两个操作数都转换为无符号整数类型 对应带符号整数类型的操作数的类型。
假设我有以下代码:
#include <stdio.h>
int main()
{
unsigned int a = 10;
signed int b = -5;
printf("%d\n", a + b); /* 5 */
printf("%u\n", a + b); /* 5 */
return 0;
}
我认为加粗的段落适用(因为 unsigned int 和 signed int 具有相同的排名。为什么 b 不转换为 unsigned ?或者它可能转换为无符号但有一些我不明白?
感谢您的宝贵时间 :-)
【问题讨论】:
-
是什么让您认为
b没有转换为unsigned? -
@Charles Bailey 我想我愚蠢地期待 printfs 的不同结果:-?
-
+5 是 +5,无论 int 是有符号还是无符号。
-
感谢所有提供帮助的人(没有足够的代表 +1):-)
-
@user963368:您传递给
printf的格式说明符应该与相应参数的类型匹配。如果你弄错了,编译器不会告诉你。此外,加法的结果在int和unsigned int的可表示范围内,因此在这两种类型中应该具有相同的表示。