C:unsigned int上的模运算符给出了意外的输出

时间:2013-04-20 15:48:12

标签: c unsigned modulus unsigned-integer

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

2 个答案:

答案 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