以int爲4字節爲例
unsigned int 0的二進制表示爲(後面解釋爲什麼用unsigned int)
00000000 00000000 00000000 00000000
那麼對其取反得:
11111111 11111111 11111111 11111111
因爲int型第32位爲符號位,所以要對上數右移一位,既得:
01111111 11111111 11111111 11111111
即2147483647
最小值即對上數再進行取反,得:
10000000 00000000 00000000 00000000
即-2147483648
代碼如下:
int main(int argc, char *argv[])
{
int a=(~(unsigned int)0)>>1;
printf("max:%d\nmin:%d \n",a,~a);
system("PAUSE");
return 0;
}
13年8月11日
補充:
關於爲什麼要用unsigned int 0來進行操作:
這涉及到兩個概念,邏輯右移和算數右移
所謂邏輯右移就是,空缺的高位補零。
所謂算術右移就是,要保持符號位不變。
如果使用 unsigned int 0來進行初始操作,則沒有符號位,右移操作是邏輯右移。
如果使用int 0來進行初始操作,則最高位是符號位,而有符號數的>>操作是編譯器相關的。
即不同編譯器,有可能進行算術右移,也有可能進行邏輯右移。
另外,算術左移和邏輯左移是相同的,不要求保持符號位不變。
總結一下:
算術左移、邏輯左移、邏輯右移:空缺用0補。
算術右移:空缺用符號位補,即符號位自身回溯,保證正爲正,負爲負。
綜上,由於>>操作的編譯器相關導致的不確定性,《C和指針》建議,不要對有符號數進行>>操作。
另外,用cout輸出十六進制和八進制,可用如下方式:
#include <iomanip>
cout<<setbase(16)<<a;
參數只支持8 16 10,其他參數視爲10,自己試的,有錯誤請提出。