32位和64位程式設計的資料型別長度區別

2021-06-12 07:01:31 字數 2124 閱讀 7570

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的資料...