不用sizeof(), 判斷系統是32位還是16位或64位

今天偶然看到這個題目,想了一下,然後是在網上搜了一大堆,終於,找到了一個令我自己比較滿意的答案。下面介紹一下:

        由於系統是16位或32位或64位,在某種意義上來說指的是其地址總線的條數,也等價於其CPU一次能夠處理的數據的最大位數。而我們在程序中與地址相關的就是指針了,所以基於這些理由,可以想象,我們可以從判斷指針所佔的字節數入手,編寫代碼:

#include<stdio.h>

//由於要用到strlen函數,所以要包含string.h頭文件

#include <string.h>  

int main(int argc, char* argv[])
{

//所要判斷的系統可能爲64位系統,此時地址由16個十六進制數和一個\0,共17位
char buf[17];

//定義一個char類型的指針,讓其指向0號地址單元,此時p的值爲0x0000(16位系統)或0x00000000(32位系統)或……
char * p = (char *)0;             //把常數0強制轉換爲char * 類型的指針

        //把指針p的值用%p格式化到數組buf中,此時假設p = 0x00000000,則buf[0] = 0,buf[1] = 0,……buf[8] = 0, buf[9] = '\0';
sprintf(buf,"%p",p);   

        //調用strlen函數求buf中字符的個數,即p對應的十六進制數的數字的個數;然後乘以4就可得到系統有多少位
printf("System is %d bit.\n",strlen(buf)*4);  
return 0;
}

注:

1):int sprintf( char *buffer,const char *format [,argument] ...);函數在格式化時,會在子否串的末尾自動加上‘\0’;

2):注意'%p'的用法,如:printf("%p\n",&i);會以十六進制輸出i的地址,如:0012FF44;


請參考:http://topic.csdn.net/u/20110926/14/3CF3149D-6715-471D-9105-933D55E9C9AD.html,其中的第63和64樓。

發佈了15 篇原創文章 · 獲贊 6 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章