#include <stdio.h>
main() {
unsigned a = -20;
unsigned b = 10;
printf("%d\n", (a % b));
printf("%d\n", (-20 % 10));
}
Output:
6
0
第二个printf打印预期值0,而第一个printf打印6。 为什么这个意外的输出带有无符号整数?
答案 0 :(得分:5)
unsigned int
可以保存0到UINT_MAX
之间的值,没有负值。因此-20
会转换为-20 + UINT_MAX + 1
。
在您的系统上:
(-20 + UINT_MAX + 1) % 10 != -20 % 10
答案 1 :(得分:2)
你还在期待什么?
a % b
相当于,让我们替换值并将一元-
应用于无符号整数值20,(UINT_MAX-20+1) % 10
,结果类型为unsigned int
并且你用%d
打印它,这是错误的。你应该在这里使用%u
。