#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. 爲什麼要通過無符號的整數這種意外輸出?C:上無符號整型模運算符給出意想不到輸出,而第一個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. 爲什麼要通過無符號的整數這種意外輸出?C:上無符號整型模運算符給出意想不到輸出,而第一個printf打印0
unsigned int
可以保存從0到UINT_MAX
的值,沒有負值。所以-20
轉換爲-20 + UINT_MAX + 1
。
在您的系統:
(-20 + UINT_MAX + 1) % 10 != -20 % 10
而且你有什麼期待?
a % b
相當於,讓我們來替代的價值和應用一元-
20,(UINT_MAX-20+1) % 10
的無符號整型值和結果的類型是unsigned int
和你與%d
,這是錯誤的打印。您應該在這裏使用%u
。
因爲'1 << 32'不能被10整除?順便說一句:*爲什麼*你使用一個unsigned int的負初始值? BTW2:printf()具有用於未簽名整數的「%u」說明符。 '%d'用於signed int。 – wildplasser 2013-04-20 15:51:03