參考來源:http://blog.urdada.net/2008/04/18/85/
不同位元(32 bits, 64 bits)的作業系統下面的型別大小不一定相同
1.《Bypass the 2GB file size limit on 32-bit Linux => 64-bit 的系統下,long 的長度也是各自表述的!
2.int 的大小即使到了 64-bit 的機器上,大部分的系統仍然使用 4 bytes 的大小而已,這主要是為了避免程式從 32-bit 系統轉換到 64-bit 系統需要修改太多地方
3.參考 Wikipedia: 64-bit data models 的說明
絕大多數的 UNIX 系統在 64-bit 下面採用 LP64 這種 data model,此時 long 就不再是固定為 4 bytes 大小,而是變成 8 bytes 的大小了!
然而,Win64 卻不是使用 LP64,而是採用 LLP64 這個 data model,這時候 long 的大小仍然還是 4 bytes
Many 64-bit compilers today use the LP64 model (including Solaris, AIX, HP, Linux, Mac OS X, and IBM z/OS native compilers). Microsoft's VC++ compiler uses the LLP64 model.
兩種 data model 的最大差異點就是 long 這個資料型態的大小,LP64 是 64-bit,而 LLP64 則是 32-bit
LLP64 data model 基本上可以說跟 32-bit 的系統一樣,唯一差別只有位址(pointer)改成了 64-bit 而已。資料物件(class, structure) 等如果沒有包含 pointer 的成員的話,整個物件的大小是與 32-bit 系統一樣的!
而 LP64 則是除了位址(pointer)改成 64-bit 之外,long 的大小也變成了 64-bit 大小。所以在 UNIX 下面,要把 32-bit 程式 porting 到 64-bit 可能要比 Windows 多花費多一點功夫。
兩個型別問題影響著程式的相容性:
- 在 UNIX 下面,long 的大小在 32-bit 與 64-bit 的系統下是不一樣的
- 同樣是 64-bit 系統,UNIX 與 Windows 對於 long 的大小看法是不一致的
在 UNIX 下面,我們可以改用 stdint.h 這個 header file 中對於資料型態的定義:
int8_t 8-bit signed interger int16_t 16-bit signed interger int32_t 32-bit signed interger int64_t 64-bit signed interger uint8_t 8-bit unsigned interger uint16_t 16-bit unsigned interger uint32_t 32-bit unsigned interger uint64_t 64-bit unsigned interger在 Windows 下面,則改用下面這些整數固定大小的資料型態
INT8 8-bit signed integer INT16 16-bit signed integer INT32 32-bit signed integer INT64 64-bit signed integer UINT8 8-bit unsigned integer UINT16 16-bit unsigned integer UINT32 32-bit unsigned integer UINT64 64-bit unsigned integer絕對不要再使用 int 和 long !請愛用stdint.h內的型別
尤其是寫網路程式時,作業系統與作業系統的位元數所造成的型別相容性問題
參考資料:
- Wikipedia: 64-bit data models
- 64-Bit Programming Models: Why LP64?
- Introduction to Win32/Win64
- Porting 32-bit Applications to the Itanium® Architecture
- Preparing Code for the IA-64 Architecture (PDF)