32位和64位下資料大小

2021-05-08 04:05:58 字數 3162 閱讀 6338

32位下和64位下資料大小的不同

最近在linux下移植程式時遇到了乙個問題,將32位機下的程式移植到64位上,在用long型讀入檔案時發生了錯誤,讀出來的是0,後經測試原來是在32位機下和64機下某些資料型別表示的不一樣。測試程式如下:

#include

int main ()

在windows下,是這樣的結果

winxp       32 x64

char        1   1

short       2   2

int         4   4

long        4   4

long long   8   8

float       4   4

double      8   8

long double 8   8

pointer     4   8

而在linux下面,卻是另乙個結果

linux      x86 amd64

char        1   1

short       2   2

int         4   4

long        4   8

long long   8   8

float       4   4

double      8   8

long double 12  16

pointer     4   8

由此可見,在移植程式時,要特別注意long,long double和pointer指標型別的使用。

資料在記憶體中儲存的方法也不一樣:

little-endian 是將低位位元組儲存在記憶體的低位址中,將高位位元組儲存在記憶體的高位址中。

big-endian 是將高位位元組儲存在記憶體的低位址中,將低位位元組儲存在記憶體的高位址中。

3. 64long int型別的布局

低位址

高位址

little endian

byte 0

byte 1

byte 2

byte 3

byte 4

byte 5

byte 6

byte 7

big endian

byte 7

byte 6

byte 5

byte 4

byte 3

byte 2

byte 1

byte 0

例如,32 位的字 0x12345678 在 big endian 機器上的布局如下:

4. 0x12345678big-endian系統上的布局

記憶體偏移量01

23記憶體內容

0x12

0x34

0x56

0x78

如果將 0x12345678 當作兩個半字來看待,分別是 0x1234 和 0x5678,那麼就會看到在 big endian 機器上是下面的情況:

5. 0x12345678big-endian系統上當作兩個半字來看待的情況

記憶體偏移量02

記憶體內容

0x1234

0x5678

然而,在 little endian 機器上,字 0x12345678 的布局如下所示:

6. 0x12345678little-endian系統上的布局

記憶體偏移量01

23記憶體內容

0x78

0x56

0x34

0x12

類似地,兩個半字 0x1234 和 0x5678 如下所示:

7. 0x12345678little-endian系統上作為兩個半字看到的情況(對此表示懷疑,要實驗一下)

記憶體偏移量02

記憶體內容

0x3412

0x7856

從 32 位遷移到 64 位時,增長的主要型別是指標和派生資料型別,如控制代碼。在 windows 64 位中,目前的指標和派生型別64位long 型別。大小增加的其他一些型別還有:wparam、lparam、lresult 和 size_t。其中乙個原因是,它們作為引數使用,並且某些函式將指標作為引數使用

從「int」和「long」派生出的所有型別的大小仍然是32 位,其中包括dword、uint 和 ulong。小於 32 位的型別保留它們當前的大小。乙個示例就是「short」資料型別,它仍然保留為 16 位的帶符號整數。

注意這裡已經明顯指出了控制代碼的大小是64位

看來 開始進行 64 位 windows 系統程式設計之前需要了解的所有資訊 所描述的控制代碼仍然是32位的說法是完全錯誤的.

32位64位下資料型別

c語言中基本資料型別的長度 32位下 char 1個位元組 不變 指標變數 4個位元組 32位機的定址空間是4個位元組。同理64位編譯器 變化 short int 2個位元組 不變 int 4個位元組 不變 unsigned int 4個位元組 不變 float 4個位元組 不變 double 8個...

32位和64位機資料型別的大小

32位系統和64位有什麼區別?通常的64位技術是相對32位而言的,這個位數指的是cpu gprs general purpose register通用暫存器 的資料寬度為64位,而32位的處理器的通用暫存器的資料寬度為32位,64位指令集就是執行64位資料的指令,也就是說一次可以執行64bit的資料...

32位和64位的理解

大家都知道現在流行的作業系統是32位和64位的,都知道32位作業系統能 認出 4g以內的記憶體而64位的 可以認出多記憶體 2的64次方byte 簡稱大b,還有一種是小b,1個byte由8個bit組成 但是為什麼會64位的能認到的記憶體就多呢?先看一下概念 32位和64位 cpu一次處理資料的能力是...