-3
#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。为什么这个带有无符号整数的意外输出?

4

2 回答 2

5

unsigned int可以保存从 0 到 的值UINT_MAX,没有负值。所以-20转换为-20 + UINT_MAX + 1.

在您的系统上:

(-20 + UINT_MAX + 1) % 10 != -20 % 10
于 2013-04-20T15:51:00.830 回答
2

你在期待什么?

a % b等效于,让我们替换这些值并将一元-应用于 unsigned int 值 20,(UINT_MAX-20+1) % 10结果的类型是unsigned int并且您正在使用 打印它%d,这是错误的。你应该%u在这里使用。

于 2013-04-20T15:52:19.707 回答