隨著64位windows的慢慢普及,現(xiàn)在做windows下的應(yīng)用開(kāi)發(fā),尤其是系統(tǒng)的一些插件的開(kāi)發(fā)(IE、Explorer等),越來(lái)越需要同時(shí)開(kāi)發(fā)32位和64位的版本了,這就要我們?cè)趯?xiě)代碼的時(shí)候尤其注意對(duì)指針和整型數(shù)據(jù)的操作,以避免出問(wèn)題。
同一份代碼,可以根據(jù)Platform為Win32或X64來(lái)產(chǎn)出對(duì)應(yīng)的版本,這是我們的目的。
字長(zhǎng)模型
指針類(lèi)型一般是跟隨系統(tǒng)位數(shù)的,32位系統(tǒng)下指針為32位,64位系統(tǒng)下指針為64位,這個(gè)一般不會(huì)混淆,但是來(lái)到整型數(shù)據(jù)類(lèi)型的時(shí)候,這里就有字長(zhǎng)模型的區(qū)別了。
字長(zhǎng)模型中I表示int,L表示long,P表示pointer,LL表示long long,如ILP32指int、long、pointer都是32位,LLP64指long long和pointer是64位。
32位系統(tǒng)有ILP32和LP32兩種,64位系統(tǒng)有LP64、ILP64、LLP64三種,這都是常見(jiàn)的字長(zhǎng)模型,出現(xiàn)這些模型的原因是C/C++語(yǔ)言并有沒(méi)有規(guī)定諸如int、long等這些整型的長(zhǎng)度,只是規(guī)定了這些類(lèi)型的長(zhǎng)度下限和相互的大小關(guān)系(如short <= int <= long <= long long),具體的實(shí)現(xiàn)由各個(gè)編譯器自行決定。
我們先來(lái)看一下在不同的字長(zhǎng)模型下,不同整型所占用的空間大?。?/p>
| LP32 | ILP32 | LLP64 | LP64 | ILP64 | |
|---|---|---|---|---|---|
| char | 8 | 8 | 8 | 8 | 8 |
| short | 16 | 16 | 16 | 16 | 16 |
| int | 16 | 32 | 32 | 32 | 64 |
| long | 32 | 32 | 32 | 64 | 64 |
| long long | 64 | 64 | 64 | 64 | 64 |
| pointer | 32 | 32 | 64 | 64 | 64 |
Visual C++使用的字長(zhǎng)模型
VC的32位字長(zhǎng)模型是ILP32,而64位字長(zhǎng)模型是LLP64,這是因?yàn)閺?2位往64位遷移的時(shí)候,為了盡量減少兼容性的問(wèn)題,所以除了指針的位數(shù)從32位升到64位之外,其他整型的長(zhǎng)度都沒(méi)有變化。所以用vc進(jìn)行64位程序開(kāi)發(fā)和32位程序開(kāi)發(fā)最大的不同就是指針的大小。
另外,long long是C99才引入的,所以是VC6之后才支持這個(gè)類(lèi)型,相比與long long,windows下更常用的是__int64(long long也是__int64 typedef的)
類(lèi)UNIX系統(tǒng)的各類(lèi)編譯器在64位下一般都是使用LP64字長(zhǎng)模型。
32位/64位程序一體開(kāi)發(fā)
要達(dá)到一套代碼自適應(yīng)32位和64位,我們就需要用到windows給我們定義的兩套數(shù)據(jù)類(lèi)型,一種是精準(zhǔn)的數(shù)據(jù)類(lèi)型,其不論在32位還是64位下大小都是一樣的(一般以長(zhǎng)度結(jié)尾),如DWORD32、DWORD64、INT32、INT64、UINT32、UINT64等;另一種就是所謂的“多態(tài)類(lèi)型”,其長(zhǎng)度以指針的長(zhǎng)度作為基準(zhǔn)(一般以_PTR結(jié)尾),常用的有:LONG_PTR、ULONG_PTR、UHALF_PTR(無(wú)符號(hào)指針長(zhǎng)度的一半)、LPARAM、WPARAM(即UINT_PTR)
總的來(lái)說(shuō),指針我們一般都要使用_PTR這種類(lèi)型,如果需要確定長(zhǎng)度的就使用精確類(lèi)型,其他情況普通類(lèi)型也可以勝任。