操作系統位長判斷源碼

前言

在計算機的發展中,經歷了8位機到64位機的歷程,在不久的將來還會有更高位長的計算機出現,它們的每一次升級都是技術的一次大進步,正是如此才構造如此紛繁多樣的數字電子世界。儘管高性能計算機不斷涌現,但是諸如低端的8位機也並沒有退出人們的視野,比如常見的51及STM8系列的8位機仍然用在一些實時控制終端領域。如何識別操作系統的位長,這是一個程序員面試常考題,這裏用C語言剖析如何實現操作系統位長的判斷。

算法實現

操作系統的位長決定機器的尋址能力,比如8位機的尋址能力爲2^8=256B、32位機的尋址能力爲2^32=4GB、64位機的尋址能力爲2^64=……好吧,反正挺大的,足夠現在的計算場景應用了。理解了計算機的內存尋址,那麼C語言的指針就派上用場,指針作爲內存地址的映射反映着計算機的尋址範圍。8位機的尋址總線爲8位,那麼它的指針的大小也是8位的,其它的也與此類似。根據這個原理,我們用兩種方法實現操作系統位數判斷:

  1. sizeof(指針)形式,通過求取指針的大小來反映主機的位長
  2. 指針數組形式,通過一個數組存放兩個地址空間連續的指針元素,然後相減得到主機位長
#include <stdio.h>
int main(int argc, char* argv[])
{
       char* tmp;
       char *p[2];

       printf("use the sizeof method\n");
       printf("The oprerate system bit is = %d\n",8*sizeof(tmp));
       printf("use the pointer array method\n");
       printf("The oprerate system bit is = %d\n",8*((char *)&p[1] - (char *)&p[0]));	   
       //printf("The oprerate system bit is = %d\n",8*((&p[1] - &p[0]));
       //printf("%#x  %#x         %#x %#x\n",&p[1],(char *)&p[1],&p[0],(char *)&p[0]);

}

在Ubuntu64位機系統下運行結果

在嵌入式32位機系統下運行結果

番外

可以看到,源碼中有一行代碼屏蔽,它是用來輸出指針數組元素指針地址的,我們把它的註釋去掉,重新編譯運行結果如下,指針數組元素指針地址加與不加(char *)強制類型轉換的結果是一樣的,兩元素的地址相差8個B。

那麼問題來了,如果不進行(char *)強制類型轉換(printf("The oprerate system bit is = %d\n",8*(&p[1] - &p[0]));)的打印輸出結果會是怎樣的呢,我們重新編譯運行,結果如下圖,明顯結果就不一樣了,儘管指針數組元素指針地址加與不加(char *)強制類型轉換的結果是一樣的,兩元素的地址相差還是8個B。但是&p[1] - &p[0]打印輸出的值是1個B,與0x6b159ad8-0x6b159ad0兩地址相減爲8不符,這顯然是編譯器優化的結果(每次運行的地址是隨機分配的,所以每一次運行得到的值不一定相同)。小結:&取地址運算符與指針的值有時並不一定相等,還需要看它們的應用場合。

總結

操作系統的位長決定機器的尋址空間,位長越長的機子,尋址能力越大,可以理解爲計算能力與精度的提升。但是字長越長,所需花費在尋址上的資源消耗越多,以4GB內存爲例,剛好就是32位機的尋址空間,如果用64系統就顯得大材小用,同時系統爲指針等變量開闢的空間會佔用更多的資源,這顯然不經濟,可以說4GB以下的內存用32位比64位好(當然,由於虛擬內存技術的應用,現在已經不能夠簡單用物理內存的大小來判斷了)。原創不易,轉載請說明出處。

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