为什么 (-1)%(unsigned int) 不同于 (-1)%(int) +(它用 uint 计算什么并且转换为 int 是一个很好的解决方案)

Why is (-1)%(unsigned int) different than (-1)%(int) +(what is it calculating with uint and is casting to int a good solution)

#include <stdio.h>
int main()
{
    unsigned int a=10;
    int b=10;
    int c=-1;
    printf("%d %d %d",(c%a),(c%(int)a),(c%b));
    return 0;
}

输出“5 -1 -1”(使用https://www.onlinegdb.com/)。到达5是在计算什么?并且只是将 unsigned int 转换为 int 正确的修复,只要它适合 int 吗?

C 的所有算术运算符(<<>> 除外,它们仅对第一个操作数执行此操作)在执行操作之前将两个操作数提升为通用类型,根据语言的规则类型推广。将 c(值为 -1)提升为 unsigned 执行模归约,模一加上类型中可表示的最大值,即一加 UINT_MAX。 -1 与 "one plus" 抵消,结果为 UINT_MAX,通常为 4294967295。那么 4294967295U % 10U 当然是 5。