C獲得int的最大值最小值,算術右移,邏輯右移

以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,自己試的,有錯誤請提出。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章