2013-05-02 74 views
3

我很困惑。例如:intN_t和uintN_t之間的比較

int x=-1; 
unsigned y=0; 
(x<y) ----> false 

int8_t x=-1; 
unint8_t y=0; 
(x<y) ----> true 

此外,編譯器會在第一次比較時引發警告,但不會引發第二次比較。看來,對於

  • (INT VS無符號) - 詮釋爲無符號
  • (intN_t VS uintN_t) - uintN_t升爲intN_t

爲什麼有這種現象?真的嗎?

+0

int8_t和uint8_t是char – 2013-05-02 16:54:31

+0

@ 0A0D那麼呢? – 2013-05-02 16:55:07

+0

@ 0A0D int16_t,int32_t,.. – gone 2013-05-02 16:56:17

回答

3

無論何時將任何二進制算術運算符(包括比較)應用於一對短於int的數字類型,C在執行操作之前都會將兩個操作數轉換爲int

每當你將任何二進制算術運算符一對數字類型的大小相同,在符號類型不匹配,並int短,C的符號操作數轉換爲無符號的操作之前。

這些是「integer promotion」規則中的兩條。它們不是非常直觀的,如果今天從頭開始設計C,它們可能不是一個人會做的事情,但它們就是它們的樣子,我們被它們困住了。

2

這是通常的整數轉換的結果。

在第一種情況下,兩個操作數的排名至少爲int,並且具有相同的等級,所以它們被轉換爲無符號整數類型。

在第二種情況下,int8_tchar(它必須是,如果它存在的話),這樣兩個操作數都提升到int-10都可以在int中表示,所以沒有警告。

+0

'short'不能是8位,它需要能夠表示至少[-32767,32767]的時間間隔(是的,不是-32768,由於C99奇怪的認爲非二進制補碼算法仍然存在值得困擾的支持)。如果'char'大於8位,'int8_t'可能是一個特殊的擴展類型。 – zwol 2013-05-02 16:58:43

+0

http://stackoverflow.com/a/697531/195488 – 2013-05-02 17:02:03

+0

如果char大於8位,那麼您可能不會有int8_t(這是實現提供的可選類型之一,因爲標準編寫者希望認爲某人將在某處運行的UNIVAC實施C99)。 – 2013-05-02 17:31:48