Windows上64位程式設計

2022-05-08 09:33:18 字數 2104 閱讀 4271

windows上64位程式設計

2023年6月21日 18:01

c/c++僅僅定義了這些基本資料型別之間的關係,並沒有定義嚴格定義它們的字長。在不同的平台上,根據編譯器不同的實現,它們的字長如下表所示: 

資料型別

lp64

ilp64

llp64

ilp32

lp32

char

short

16 16 

_int32

n/an/a

n/an/a

intlong

long long

n/an/a

n/an/a

pointer

在這張表中,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採用的是ip32資料模型,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:msdn中說是在basetsd.h中定義的,但實際上是在winnt.h中定義的。 

小試一把 64 位 Windows 程式設計

環境 windows 2003 server x64 edition,visual studio 2005 64 bit 的程式設計模型有很多種 lp64 llp64 ilp64 windows x64 版採用的是 llp64 模型 int long 都是 32 bit,void 是 64 bit,...

小試一把 64 位 Windows 程式設計

環境 windows 2003 server x64 edition,visual studio 2005 64 bit 的程式設計模型有很多種 lp64 llp64 ilp64 windows x64 版採用的是 llp64 模型 int long 都是 32 bit,void 是 64 bit,...

在64位Windows的IIS上開啟32位程式支援

經常碰到32位的dll什麼的不能在64位windows的iis上呼叫,在網上找到這篇文章也許能夠解決很多問題。總的思路就是先允許iis支援32位程式,然後再用.net framework註冊iis。this article 1.enable iis s 32 bit support open a c...