2013-04-20 61 views
-1
#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

+3

因爲'1 << 32'不能被10整除?順便說一句:*爲什麼*你使用一個unsigned int的負初始值? BTW2:printf()具有用於未簽名整數的「%u」說明符。 '%d'用於signed int。 – wildplasser 2013-04-20 15:51:03

回答

4

unsigned int可以保存從0到UINT_MAX的值,沒有負值。所以-20轉換爲-20 + UINT_MAX + 1

在您的系統:

(-20 + UINT_MAX + 1) % 10 != -20 % 10 
2

而且你有什麼期待?

a % b相當於,讓我們來替代的價值和應用一元- 20,(UINT_MAX-20+1) % 10的無符號整型值和結果的類型是unsigned int和你與%d,這是錯誤的打印。您應該在這裏使用%u

相關問題