1. 程式人生 > >32位和64位程式的區別

32位和64位程式的區別

轉自:https://blog.csdn.net/nma_123456/article/details/45077345

由於作業系統記憶體分配的不同,導致軟體開發過程中,需要編譯不同版本的軟體,此處以VS為例。

1、編譯程式根據需要選擇不同的編譯環境:

X86和win32位32位程式,X64為64位程式,可以選擇不同的編輯條件形成不同位的軟體。

2、程式碼中的基本的資料型別,會根據作業系統的位數分配記憶體大小:
如int型在32位作業系統為4位元組,在64位系統為8位元組

因此在64位上對int型資料操作,編譯生成32的程式,有可能導致int型越界,軟體出現問題

3、32位的程式在64位作業系統上執行,由於64位作業系統的定址和偏移的問題,也有可能導致程式在執行過程中,計算結果與32位系統不一致

4、64位作業系統理論上能夠相容32位和64位軟體,32位作業系統不能執行64程式

5、使用VS2010或VS2012開發的程式,強制編譯為32位軟體,在xp系統下執行有問題,有可能與.net framework版本有關係,低版本的framework不能支援高版本framework的一些控制元件或類庫。嘗試安裝高版本的framework解決問題

借用一下部落格內容:

一)64位系統和32位有什麼區別? 

1、64bit CPU擁有更大的定址能力,最大支援到16GB記憶體,而32bit只支援4G記憶體

2、64位CPU一次可提取64位資料,比32位提高了一倍,理論上效能會提升1倍。但這是建立在64bit作業系統,64bit軟體的基礎上的。

 

什麼是64位處理器?

之所以叫做“64位處理器”,是因為電腦內部都是實行2進位制運算,處理器(CPU)一次處理資料的能力也是2的倍數。8位處理器、16位處理器、32位處理器和64位處理器,其計數都是2的倍數。一次處理的資料越大,該電腦處理資訊的能力越來越大;因此64位處理在先天就比32位處理器具有快速的能力。那為什麼不用更高階的128位處理器呢?因為位數越高,處理器晶片的設計也就越複雜,目前的技術水平暫時無法制造這麼複雜的晶片。

 

64位處理器之失

※硬體———缺乏驅動程式,很多現有硬體無法使用

※軟體———作業系統不是問題,但是軟體出現不相容難題

 

64位處理器之得

※硬體———更快的執行速度,更大的記憶體管理

※軟體———最新的尖端軟體首先出現在64位平臺

 

(二)資料型別對應位元組數

程式執行平臺
      不同的平臺上對不同資料型別分配的位元組數是不同的。
      個人對平臺的理解是CPU+OS+Compiler,是因為: 
      1、64位機器也可以裝32位系統(x64裝XP); 
      2、32位機器上可以有16/32位的編譯器(XP上有tc是16位的,其他常見的是32位的); 
      3、即使是32位的編譯器也可以弄出64位的integer來(int64)。 
      以上這些是基於常見的wintel平臺,加上我們可能很少機會接觸的其它平臺(其它的CPU和OS),所以個人認為所謂平臺的概念是三者的組合。 
      雖然三者的長度可以不一樣,但顯然相互配合(即長度相等,32位的CPU+32位的OS+32位的Compiler)發揮的能量最大。 
      理論上來講 我覺得資料型別的位元組數應該是由CPU決定的,但是實際上主要由編譯器決定(佔多少位由編譯器在編譯期間說了算)。

常用資料型別對應位元組數
  可用如sizeof(char),sizeof(char*)等得出

 32位編譯器:

      char :1個位元組
      
char*(即指標變數): 4個位元組(32位的定址空間是2^32, 即32個bit,也就是4個位元組。同理64位編譯器)
      short int : 2個位元組
   
   int:  4個位元組
      unsigned int : 4個位元組
      float:  4個位元組
      double:   8個位元組
      long:   4個位元組
      long long:  8個位元組
      unsigned long:  4個位元組

  64位編譯器:

      char :1個位元組
      
char*(即指標變數): 8個位元組
      short int : 2個位元組
     
 int:  4個位元組
      unsigned int : 4個位元組
      float:  4個位元組
      double:   8個位元組
      
long:   8個位元組
      long long:  8個位元組
      
unsigned long:  8個位元組