我很困惑。例如: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
爲什麼有這種現象?真的嗎?
我很困惑。例如: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
的數字類型,C在執行操作之前都會將兩個操作數轉換爲int
。
每當你將任何二進制算術運算符一對數字類型的大小相同,在符號類型不匹配,並不比int
短,C的符號操作數轉換爲無符號的操作之前。
這些是「integer promotion」規則中的兩條。它們不是非常直觀的,如果今天從頭開始設計C,它們可能不是一個人會做的事情,但它們就是它們的樣子,我們被它們困住了。
這是通常的整數轉換的結果。
在第一種情況下,兩個操作數的排名至少爲int
,並且具有相同的等級,所以它們被轉換爲無符號整數類型。
在第二種情況下,int8_t
是char
(它必須是,如果它存在的話),這樣兩個操作數都提升到int
。 -1
和0
都可以在int
中表示,所以沒有警告。
'short'不能是8位,它需要能夠表示至少[-32767,32767]的時間間隔(是的,不是-32768,由於C99奇怪的認爲非二進制補碼算法仍然存在值得困擾的支持)。如果'char'大於8位,'int8_t'可能是一個特殊的擴展類型。 – zwol 2013-05-02 16:58:43
http://stackoverflow.com/a/697531/195488 – 2013-05-02 17:02:03
如果char大於8位,那麼您可能不會有int8_t(這是實現提供的可選類型之一,因爲標準編寫者希望認爲某人將在某處運行的UNIVAC實施C99)。 – 2013-05-02 17:31:48
int8_t和uint8_t是char – 2013-05-02 16:54:31
@ 0A0D那麼呢? – 2013-05-02 16:55:07
@ 0A0D int16_t,int32_t,.. – gone 2013-05-02 16:56:17