int型字長問題

2021-06-26 16:51:53 字數 1867 閱讀 5206

int

型字長問題:

long int型至少應該和int型一樣長,而int型至少應該和short int一樣長。

①c/c++

規定int字長和機器字長相同;

②作業系統字長和機器字長未必一致;

③編譯器根據作業系統字長來定義int字長;

由上面三點可知,在一些沒有作業系統的嵌入式計算機系統上,int的長度與處理器字長一致;有作業系統時,作業系統的字長與處理器的字長不一定一致,此時編譯器根據作業系統的字長來定義int字長:「比如你在64位機器上執行dos16系統,那麼所有for dos16的c/c++編譯器中int都是16位的;在64位機器上執行win32系統,那麼所有for win32的c/c++編譯器中int都是32位的」。(cpu的「字長」是指其一條指令/一次運算可以處理的資料的最大寬度。

另外,對於整型的數值範圍,每個編譯器裡面都有乙個標準標頭檔案:limits.h

,這個標頭檔案定義了一些巨集,這些巨集表示該編譯器使用的所有資料型別的範圍,程式設計過程中使用這些巨集就行了。例如你想要的int的最大值可以使用巨集int_max,最小值使用int_min,而無符號則可以使用uint_max,還有其它型別的。你自己把這個標頭檔案開啟看看就知道了。

附:關於「整形變數為32位」的問題的剖析:

整形變數是不是32位這個問題不僅與具體的cpu架構有關,而且與編譯器有關。在嵌入式系統的程式設計中,一般整數的位數等於cpu字長,常用的嵌入式cpu晶元的字長為8、16、32,因而整形變數的長度可能是8、16、32。在未來64位平台下,整形變數的長度可達到64位。

長整形變數的長度一般為cpu字長的2倍。

在資料結構的設計中,優秀的程式設計師並不會這樣定義資料結構(假設為win32平台):

typedef struct tagtypeexample

typeexample;

他們這樣定義:

#define unsigned short uint16 //16位無符號整數

#define unsigned int uint32 //32位無符號整數

typedef struct tagtypeexample

typeexample;

這樣定義的資料結構非常具有通用性,如果上述32平台上的資料傳送到16位平台上接收,在16位平台上僅僅需要修改uint16、uint32的定義:

#define unsigned int uint16 //16位無符號整數

#define unsigned long uint32 //32位無符號整數

幾乎所有的優秀軟體設計文件都是這樣定義資料結構的。

char

型與程式可移植性:

char型別變數在本質上是小整型值。

字元型(char型)也分signed char和unsigned char型,如果在定義變數時只使用關鍵字char,預設情況下它根據編譯器的定義為signed char或unsigned char,這意味著不同機器上的char可能有不同的取值範圍。因此,只有當程式使用的char型變數的值位於signed char和unsigned char的交集中(例如編譯器認為char為8位二進位製長時,這個交集是0~127,ascⅱ字符集的字元都在這個範圍內),這個程式才是可移植的。

進一步,如果顯示地將字元變數宣告為signed或unsigned,則可提高程式的可移植性,不過,有些機器處理signed char和unsigned char的能力是不同的,硬性規定後可能會使效率受損,還有不少處理字元的庫函式的引數宣告為char,因此顯示宣告也可能會有相容性問題。

結論:保證可移植性的最佳辦法還是定義為char型同時只使用signed char和unsigned char型的交集字元,在進行算術運算時,可根據需要再使用顯示地宣告或者強制轉換。

int強制轉char型問題理解

include int main 結果輸出是 000000f7 和fffffff7 16進製制的0xfffffff7轉化為2進製是 1111,1111,1111,1111,1111 1111 1111 0111 unsigned char i unsigned char a int型強制轉化成cha...

int 佔乙個機器字長

int與short int是不一樣的。c 標準規定,int佔乙個機器字長。在32位系統中int佔32位,也就是4個位元組,而在老式的16位系統中,int佔16位,即2個位元組。而c 標準中只限制規定short int不能超過int的長度,具體長度的可以由c 編譯器的實現廠商自行決定。目前流行的32位...

char 型陣列Int型互轉

include include typedefunsignedcharuchar typedefunsignedintuint 轉換函式 temp 字元型陣列 pout int型陣列 length 字元型陣列的長度 這裡假設字元型陣列裡包含的都是偶數個元素 如果是奇數個數,則需要增加如下處理 檢查l...