c/c++僅僅定義了這些基本資料型別之間的關係,並沒有定義嚴格定義它們的字長。在不同的平台上,根據編譯器不同的實現,它們的字長如下表所示:
資料型別
lp64
ilp64
llp64
ilp32
lp32
char88
888short
1616
1616
16_int32
n/a32
n/an/a
n/aint
3264
3232
16long
6464
3232
32long long
n/an/a
64n/a
n/apointer
6464
6432
32在這張表中,lp64,ilp64,llp64是64位平台上的字長模型,ilp32和lp32是32位平台上的字長模型。
lp64意思是long和pointer是64位,ilp64指 int,long,pointer是64位,llp指long long和pointer是32-bit的。ilp32指int,long和pointer是32位的,lp32指long和pointer是32位的。
32位windows採用的是ilp32資料模型,64位windows採用的是llp64資料模型。
所以,windows上的32位程式設計和64位程式設計最大的不同(也就是ip32和llp64的不同),就在於指標的長度不同??由32位變成了64位。
win32 api在很多情況下,都需要將整數轉換成指標或者相反。在 32 位的硬體上不會有問題,其中指標的大小和整數的大小是相同的,但在 64 位的硬體上卻完全不一樣。
為此m$搞了個所謂的「多型型別」:
對於特定的精度,您可以使用固定精度的資料型別。不管處理器的詞大小如何,它們的大小都是一致的。大多數這些型別都在它們的名稱中包含精度,可以從下面的表中看出:
表 1. 固定精度的資料型別
型別定義
dword32
32 位無符號整數
dword64
64 位無符號整數
int32
32 位有符號整數
int64
64 位有符號整數
long32
32 位有符號整數
long64
64 位有符號整數
uint32
無符號 int32
uint64
無符號 int64
ulong32
無符號 long32
ulong64
無符號 long64
此外,當您需要資料型別的精度隨著處理器詞大小變化時,請使用指標精度資料型別。這些型別又稱為「多型」資料型別。這些型別通常以 _ptr 字尾結尾,如下面的**所示:
表 2. 指標精度的資料型別
型別定義
dword_ptr
指標精度的無符號長型別
half_ptr
指標大小的一半。用於包含乙個指標和兩個小型欄位的結構中
int_ptr
指標精度的有符號整型
long_ptr
指標精度的有符號長型別
size_t
指標可以引用的最大位元組數。用於必須跨指標的整個範圍的計數
ssize_t
有符號 size_t
uhalf_ptr
無符號 half_ptr
uint_ptr
無符號 int_ptr
ulong_ptr
無符號 long_ptr
lparam
與 long_ptr 為同義詞,(在wtypes.h 中定義)
wparam
與 uint_ptr 為同義詞,(在 wtypes.h 中定義)
通過整數引數傳遞引數或上下文資訊的所有 win32 api 都更改為使用這些新的型別。
此外,還出現了定長指標:pointer_32和pointer_64:
#define pointer_32 __ptr32
#define pointer_64 __ptr64
ps:m$dn中說是在basetsd.h中定義的,但實際上是在winnt.h中定義的。
32位64位下資料型別
c語言中基本資料型別的長度 32位下 char 1個位元組 不變 指標變數 4個位元組 32位機的定址空間是4個位元組。同理64位編譯器 變化 short int 2個位元組 不變 int 4個位元組 不變 unsigned int 4個位元組 不變 float 4個位元組 不變 double 8個...
64位與32位程式設計的資料型別區別
c c 僅僅定義了這些基本資料型別之間的關係,並沒有定義嚴格定義它們的字長。在不同的平台上,根據編譯器不同的實現,它們的字長如下表所示 資料型別 lp64 ilp64 llp64 ilp32 lp32 char 8 8 88 8 short 16 16 16 16 16 int32 n a 32 n...
32位和64位機資料型別的大小
32位系統和64位有什麼區別?通常的64位技術是相對32位而言的,這個位數指的是cpu gprs general purpose register通用暫存器 的資料寬度為64位,而32位的處理器的通用暫存器的資料寬度為32位,64位指令集就是執行64位資料的指令,也就是說一次可以執行64bit的資料...