#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。为什么这个带有无符号整数的意外输出?
#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。为什么这个带有无符号整数的意外输出?
unsigned int
可以保存从 0 到 的值UINT_MAX
,没有负值。所以-20
转换为-20 + UINT_MAX + 1
.
在您的系统上:
(-20 + UINT_MAX + 1) % 10 != -20 % 10
你在期待什么?
a % b
等效于,让我们替换这些值并将一元-
应用于 unsigned int 值 20,(UINT_MAX-20+1) % 10
结果的类型是unsigned int
并且您正在使用 打印它%d
,这是错误的。你应该%u
在这里使用。