C:无符号整数上的模运算符给出意外输出 #包括 main(){ 无符号a=-20; 无符号b=10; printf(“%d\n”,(a%b)); printf(“%d\n”,(-20%10)); } 输出: 6. 0
第二个printf打印期望值0,而第一个printf打印6。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
为什么使用无符号整数进行此意外输出?
无符号整数
可以保存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