C C 中的整型常識

2021-04-12 13:21:48 字數 1468 閱讀 7972

很多人對c/c++中的整型不太了解,導致**移植的時候出現問題,本人在此總結一下:

a. c/c++對整型長度的規定是為了執行效率,將int定義為機器字長可以取得最大的執行速度;

b. c/c++中整型包括:int, char 和 enum, c++中還包含bool型別,c99中bool是乙個巨集,實際為_bool;

c. c 和 c++ 對 enum 的規定有所不同,這裡不描述;

d. 修飾整型正負的有 signed 和 unsigned,對於 int 預設為 signed;

e. 修飾 int 大小的有 short 和 long, 部分編譯器還擴充套件了一些更長的整型,比如 long long 和 __int64, c99中增加了long long和unsigned long long;

f. int 的長度 與 機器字長相同, 16位的編譯器上int長16位,32位的編譯器上int長32位;

g. short int 的長度 小於等於 int 的長度,注意她們可能長度相等,這取決於編譯器;

h. long int 的長度 大於等於 int 的長度,注意她們可能長度相等,這取決於編譯器;

i. char 的長度應當可以包容得下乙個字元,大部分系統中就是乙個位元組,而有的系統中可能是4個位元組,因為這些系統中乙個字元需要四個位元組來描述;

j. char 的正負取決於編譯器,而編譯器的決定取決於作業系統,在不同的編譯器中char可能等同於signed char,也可能等同於unsigned char;

總結:

a. 出於效率考慮,應該盡量使用int和unsigned int;

b. 當需要指定容量的整型時,不應該直接使用short、int、long等,因為在不同的編譯器上她們的容量不相同。此時應該定義她們相應的巨集或型別,比如在vc++6.0中,可以如下定義:

typedef unsigned char ubyte;

typedef   signed char sbyte;

typedef unsigned short int uword;

typedef   signed short int sword;

typedef unsigned int udword;

typedef   signed int sdword;

typedef unsigned __int64 uqword;

typedef   signed __int64 sqword;

然後在**中使用 ubyte、sbyte、uword 等,這樣當**移植的時候只需要修改相應的型別即可。

定義自己的型別雖然在**移植的時候只需要修改一處即可,但仍然屬於源**級別的修改,所以 c++ 2.0 中將這些型別定義在模板中,可以做到**移植時無需修改**。

c. 在定義char時,一定要加上 signed 或 unsigned,因為她的正負在不同的編譯器上並不相同。

d. 不要想當然的以為char是1位元組長,因為她的長度在不同的編譯器上並不相同

C C 中的整型常識

很多人對c c 中的整型不太了解,導致 移植的時候出現問題,本人在此總結一下 a.c c 對整型長度的規定是為了執行效率,將int定義為機器字長可以取得最大的執行速度 b.c c 中整型包括 int,char 和 enum,c 中還包含bool型別,c99中bool是乙個巨集,實際為 bool c....

C C 的64位整型

在c c 中,64為整型一直是一種沒有確定規範的資料型別。現今主流的編譯器中,對64為整型的支援也是標準不一,形態各異。一般來說,64位整型的定義方式有long long和 int64兩種 vc還支援 int64 而輸出到標準輸出方式有printf lld a printf i64d a 和cout...

C C 的64位整型

在c c 中,64為整型一直是一種沒有確定規範的資料型別。現今主流的編譯器中,對64為整型的支援也是標準不一,形態各異。一般來說,64位整型的定義方式有long long和 int64兩種 vc還支援 int64 而輸出到標準輸出方式有printf lld a printf i64d a 和cout...