C:无符号整数上的模运算符给出意外输出 #包括 main(){ 无符号a=-20; 无符号b=10; printf(“%d\n”,(a%b)); printf(“%d\n”,(-20%10)); } 输出: 6. 0

C:无符号整数上的模运算符给出意外输出 #包括 main(){ 无符号a=-20; 无符号b=10; printf(“%d\n”,(a%b)); printf(“%d\n”,(-20%10)); } 输出: 6. 0,c,unsigned,modulus,unsigned-integer,C,Unsigned,Modulus,Unsigned Integer,第二个printf打印期望值0,而第一个printf打印6。 为什么使用无符号整数进行此意外输出?无符号整数可以保存0到UINT\u MAX之间的值,没有负值。因此,-20被转换为-20+UINT\u MAX+1 在您的系统上: #include <stdio.h> main() { unsigned a = -20; unsigned b = 10; printf("%d\n", (a % b)); printf("%d\n", (-20 % 10

第二个printf打印期望值0,而第一个printf打印6。
为什么使用无符号整数进行此意外输出?

无符号整数
可以保存0到
UINT\u MAX
之间的值,没有负值。因此,
-20
被转换为
-20+UINT\u MAX+1

在您的系统上:

#include <stdio.h>

main() {
    unsigned a = -20;
    unsigned b = 10;
    printf("%d\n", (a % b));
    printf("%d\n", (-20 % 10));
}

Output:
6
0

你在期待什么

a%b
相当于,让我们替换这些值,并将一元
-
应用于20的无符号int值,
(UINT\u MAX-20+1)%10
,结果的类型是
无符号int
,而您正在用
%d
打印它,这是错误的。你应该在这里使用
%u

因为
1
(-20 + UINT_MAX + 1) % 10 != -20 % 10