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

Nik*_*nka -3 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
Run Code Online (Sandbox Code Playgroud)

第二个printf打印预期值0,而第一个printf打印6.为什么这个意外输出带有无符号整数?

md5*_*md5 5

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

在您的系统上:

(-20 + UINT_MAX + 1) % 10 != -20 % 10
Run Code Online (Sandbox Code Playgroud)