先看如下代碼:
#include <stdio.h>
//small to big, signed to unsigned
int main()
{
unsigned int ui_one =1;
signed int i_one =1;
signed short s_minus_one =-1;
if(s_minus_one>ui_one)
printf("-1>1\n");
if(s_minus_one<i_one)
printf("-1<1\n");
}
輸出-1>1 ,又輸出-1<1
來解釋下原因:
1. 當兩個不同類型做運算時候,c 會遵從內存佔用小的向大的轉,有符號的向無符號的轉。
2. 負數在內存中是以補碼的形式存在的。
s_minus_one在內存中爲0xffff,和ui_one做比較的時候,s_minus_one的值變成2的16次方,所以大於1
s_minus_one 和i_one做比較的時候, 向signed int 轉, 這個時候s_minus_one 還是-1,所以小於1
MAC 系統貌似有些不一樣。要看看其他unix分支。