#include <stdio.h>
main() {
unsigned a = -20;
unsigned b = 10;
printf("%d\n", (a % b));
printf("%d\n", (-20 % 10));
}
Output:
6
0
最初の printf が 6 を出力するのに対し、2 番目の printf は期待される値 0 を出力します。
#include <stdio.h>
main() {
unsigned a = -20;
unsigned b = 10;
printf("%d\n", (a % b));
printf("%d\n", (-20 % 10));
}
Output:
6
0
最初の printf が 6 を出力するのに対し、2 番目の printf は期待される値 0 を出力します。
unsigned int
0 から までUINT_MAX
の値を保持できます。負の値は保持できません。So-20
は に変換され-20 + UINT_MAX + 1
ます。
システム上:
(-20 + UINT_MAX + 1) % 10 != -20 % 10
そして、あなたは何を期待していますか?
a % b
と同等です。値を代入して unary-
を 20 の unsigned int 値に適用してみましょう。(UINT_MAX-20+1) % 10
結果の型は であり、unsigned int
それを で出力していますが%d
、これは間違っています。ここを使うべき%u
です。