溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

利用c++怎么判斷系統(tǒng)是64位還是32位

發(fā)布時間:2020-12-11 14:39:32 來源:億速云 閱讀:585 作者:Leah 欄目:開發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)利用c++怎么判斷系統(tǒng)是64位還是32位,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

1、IsWow64Process

確定指定進(jìn)程是否運行在64位操作系統(tǒng)的32環(huán)境(Wow64)下。

語法

BOOL WINAPI IsWow64Process(
  __in HANDLE hProcess,
  __out PBOOL Wow64Process
  );

參數(shù)

hProcess

進(jìn)程句柄。該句柄必須具有PROCESS_QUERY_INFORMATION 或者 PROCESS_QUERY_LIMITED_INFORMATION 訪問權(quán)限

Wow64Process

指向一個bool值,

如果該進(jìn)程是32位進(jìn)程,運行在64操作系統(tǒng)下,該值為true,否則為false。

如果該進(jìn)程是一個64位應(yīng)用程序,運行在64位系統(tǒng)上,該值也被設(shè)置為false。

返回值

如果函數(shù)成功返回值為非零值。

如果該函數(shù)失敗,則返回值為零。要獲取擴展的錯誤的信息,請調(diào)用GetLastError .

微軟的例子:

#include <windows.h>
  #include <tchar.h>
  typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
  LPFN_ISWOW64PROCESS fnIsWow64Process;
  BOOL IsWow64()
  {
    BOOL bIsWow64 = FALSE;
    //IsWow64Process is not available on all supported versions of Windows.
    //Use GetModuleHandle to get a handle to the DLL that contains the function
    //and GetProcAddress to get a pointer to the function if available.
    fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress(
    GetModuleHandle(TEXT("kernel32")),"IsWow64Process");
    if(NULL != fnIsWow64Process)
    {
      if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64))
      {
        //handle error
      }
    }
    return bIsWow64;
  }
  int main( void )
  {
    if(IsWow64())
      _tprintf(TEXT("The process is running under WOW64.\n"));
    else
      _tprintf(TEXT("The process is not running under WOW64.\n"));
    return 0;
  }

注意:使用此函數(shù)判斷操作系統(tǒng)是32位還是64位并不合適,勉強要用的話,可以指向一個32位進(jìn)程。

2、比較合適的做法是:

  BOOL Is64bitSystem()
  {
    SYSTEM_INFO si;
    GetNativeSystemInfo(&si);
    if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 ||
            si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64 )
      return TRUE;
    else
      return FALSE;
  }

補充知識:C編程注意32位機器和64位機器的差別及unsigned和signed

1.64bit CPU擁有更大的尋址能力,最大支持到16GB內(nèi)存,而32bit只支持4G內(nèi)存

2.64位CPU一次可提取64位數(shù)據(jù),比32位提高了一倍,理論上性能會提升1倍。但這是建立在64bit操作系統(tǒng),64bit軟件的基礎(chǔ)上的。

C/C++ 32位機器和64位機器 差異問題總結(jié) 跨平臺 移植問題 語言編程需要注意的64位和32機器的區(qū)別

#include < stddef.h>
OS version:Red Hat Enterprise Linux Server release 5.3 (Tikanga) linux 2.6.18-128.el5 #1 SMP Wed Dec 17 11:41:38 EST 2008 x86_64 x86_64 x86_64 GNU/Linux
size_t本身一個作用就是避免考慮64還是32。64位下Long和指針是64位的
size_tm_unNo;
sprintf(path,"%u",m_unNo); //這句在32位機器上正常 64位機器上會編譯警告:“警告:格式 ‘%u' 需要類型 ‘unsigned int',但實參 4 的類型為 ‘size_t'”
%u 對應(yīng) unsigned int在64位機器上還是32位,而size_t已經(jīng)變成64位了。
char* 指針在64位下是64位
m_pMem = new char[nSize];
int off = (int)m_pMem%nAlign; // 在 32位編譯正常,在64位機器上編譯報錯:“ 錯誤:從 ‘char*' 到 ‘int' 的轉(zhuǎn)換損失精度”

改為就可以達(dá)到兼容效果了int off = (uint64_t)m_pMem%nAlign; // 因為int在64位下仍為32位,char×已經(jīng)變位64位了。

一、數(shù)據(jù)類型特別是int相關(guān)的類型在不同位數(shù)機器的平臺下長度不同。

C99標(biāo)準(zhǔn)并不規(guī)定具體數(shù)據(jù)類型的長度大小,只規(guī)定級別。作下比較:

16位平臺

char 1個字節(jié)8位

short 2個字節(jié)16位

int 2個字節(jié)16位

long 4個字節(jié)32位

指針 2個字節(jié)

32位平臺

char 1個字節(jié)8位

short 2個字節(jié)16位

int 4個字節(jié)32位

long 4個字節(jié)

long long 8個字節(jié)

指針 4個字節(jié)

64位平臺

char 1個字節(jié)

short 2個字節(jié)

int 4個字節(jié)

long 8個字節(jié)(區(qū)別)

long long 8個字節(jié)

指針 8個字節(jié)(區(qū)別)

二、編程注意事項

為了保證平臺的通用性,程序中盡量不要使用long數(shù)據(jù)庫型。可以使用固定大小的數(shù)據(jù)類型宏定義:

typedef signed char int8_t
typedef short int  int16_t;
typedef int   int32_t;
# if __WORDSIZE == 64
typedef long int  int64_t;
# else
__extension__
typedef long long int int64_t;
#endif

三、使用int時也可以使用intptr_t來保證平臺的通用性,它在不同的平臺上編譯時長度不同,但都是標(biāo)準(zhǔn)的平臺長度,比如64位機器它的長度就是8字節(jié),32位機器它的長度是4字節(jié),定義如下:

#if __WORDSIZE == 64
typedef long int  intptr_t;
#else
typedef int   intptr_t;
#endif

編程中要盡量使用sizeof來計算數(shù)據(jù)類型的大小

以上類型定義都有相應(yīng)的無符號類型。

另外還有ssize_t和size_t分別是unsigned和signed size of computer word size。

它們也是表示計算機的字長,在32位機器上是int型,在64位機器上long型,從某種意義上來說它們等同于intptr_t和uintptr_t。

它們在stddef.h里面定義。需要注意的是socket的accept函數(shù)在有些操作系統(tǒng)上使用size_t是不正確的,因為accept接收的int*類型,而size_t可能是long int 類型。后來BSD使用sock_t來替代它。

一、C

1.幾條規(guī)則

(1)char類型一般是8bit,但ANSI C里沒有硬性規(guī)定其長度,某些嵌入式編譯器可能是16bit

(2)short和long類型的長度不相同

(3)int類型通常同具體機器的物理字長相同

(4)short通常是16bits, int通常是16bits or 32bits每種編譯器可以根據(jù)硬件的不同自由確定, 但是short和int必須最少是16bits, 而long類型必須最少是32bits, 并且short必須比int和long類型要短。

2.32位機上類型長度

size of char: 1
size of int: 4
size of long:4
size of float:4
size of long long:8
size of double:8
size of long double:12
size of char * :4

3.64位機上類型長度

size of char:1
size of int:4
size of long :8
size of float :4
size of long long:8
size of double:8
size of long double:16
size of char * :8

4.16位機類型長度

char: 1
int: 2
long:4
unsigned int:2
unsigned short:2
unsigned long:4
float:4
size of char * :4

二、C++

1.字節(jié)和字長

字節(jié),八位就是一個字節(jié),是固定概念。字長是指計算機一次能處理的二進(jìn)制數(shù)據(jù)的長度,是一個非固定的概念。例如,8位計算機的字長為8,即一個字節(jié), 32位計算機的字長位32,即4個字節(jié),同理,64位計算機的字長為64,即8字節(jié)。

2.char類型始終是一個字節(jié)長,即8位。

3.int、short int和long int

通常int為一個字長,short為半個字長,long為一個或2個字長(在32位機器中為一個字長)。

4.浮點型float、雙精度double、和長雙精度long double

典型情況下,float 為一個字,double是兩個字,long double為三個或四個字。

32位機指針為什么是4個字節(jié) 64位與32位機的區(qū)別

int類型比較特殊,具體的字節(jié)數(shù)同機器字長和編譯器有關(guān)。如果要保證移植性,盡量用__int16 __int32 __int64吧,或者自己typedef int INT32一下。C、C++標(biāo)準(zhǔn)中只規(guī)定了某種類型的最小字節(jié)數(shù)(防止溢出)。

通常的64位技術(shù)是相對32位而言的,這個位數(shù)指的是CPU GPRs(General-Purpose register通用寄存器)的數(shù)據(jù)寬度為64位,而32位的處理器的通用寄存器的數(shù)據(jù)寬度為32位,64位指令集就是運行64位數(shù)據(jù)的指令,也就是說一次可以運行64bit的數(shù)據(jù)。

通用寄存器:可用于傳送和暫存數(shù)據(jù),也可以參與算術(shù)邏輯運算,并保存運算結(jié)果。通用寄存器的長度取決于機器字長。

字長:字長是CPU的主要技術(shù)指標(biāo)之一,指的是CPU一次能并行處理的二進(jìn)制的位數(shù),字長是8的整倍數(shù),通常的PC機的字長為16位,32位,64位。一臺16位字長的PC機可以直接處理2^16(65536)之內(nèi)的數(shù)字,對于超過此范圍的數(shù)字需要分解的方法來處理。32位機比16位機優(yōu)越的原因之一就在于它在一次操作中能處理的數(shù)字大,32位機字長的PC機能直接處理的數(shù)字為2^32(40億),能處理的數(shù)字越大,則操作的次數(shù)就越少,從而系統(tǒng)的效率就越高。

字長與尋址空間:處理器字長是指處理機能同時處理的位數(shù),處理器的字長越大,則說明它的運算能力越強。

處理的尋址范圍:要看處理器的地址總線的位數(shù),而不是它的字長。?。。。?!如Intel P4處理器字長為32位,地址總線也是32位。8086的數(shù)據(jù)總線為16為,地址總線為20位(則可尋址的內(nèi)存空間為2^20=1MB)。新興的64位處理器的數(shù)據(jù)總線為64位,地址總線大部分是32位。再看地址總線與尋址范圍的關(guān)系,存儲單元是以Byte為單位,N根地址總線能夠訪問2^N個存儲單元,于是有32為地址總線可訪問2^32個存儲單元,即4GB。

所以指針為了正確指示內(nèi)存中的地址,必須按照地址總線的寬度進(jìn)行變量的存儲,因此雖說64位CPU的數(shù)據(jù)寬度為64位而其地址總線一般不為64位(能訪問的內(nèi)存空間大的驚人,暫時估計應(yīng)該還做不到),但是一般能超過32位,因此指針的長度大于4個字節(jié)(32位),所以64位機的指針字節(jié)為64位即8個字節(jié),而32位機的地址總線一般為4個字節(jié),即支持4GB的內(nèi)存,則其指針的寬度為4個字節(jié)。

一)64位系統(tǒng)和32位有什么區(qū)別?

1、64bit CPU擁有更大的尋址能力,最大支持到16GB內(nèi)存,而32bit只支持4G內(nèi)存

2、64位CPU一次可提取64位數(shù)據(jù),比32位提高了一倍,理論上性能會提升1倍。但這是建立在64bit操作系統(tǒng),64bit軟件的基礎(chǔ)上的。

什么是64位處理器?

之所以叫做“64位處理器”,是因為電腦內(nèi)部都是實行2進(jìn)制運算,處理器(CPU)一次處理數(shù)據(jù)的能力也是2的倍數(shù)。8位處理器、16位處理器、32位處理器和64位處理器,其計數(shù)都是2的倍數(shù)。一次處理的數(shù)據(jù)越大,該電腦處理信息的能力越來越大;因此64位處理在先天就比32位處理器具有快速的能力。那為什么不用更高級的128位處理器呢?因為位數(shù)越高,處理器芯片的設(shè)計也就越復(fù)雜,目前的技術(shù)水平暫時無法制造這么復(fù)雜的芯片。

64位處理器之失

※硬件———缺乏驅(qū)動程序,很多現(xiàn)有硬件無法使用

※軟件———操作系統(tǒng)不是問題,但是軟件出現(xiàn)不兼容難題

64位處理器之得

※硬件———更快的執(zhí)行速度,更大的內(nèi)存管理

※軟件———最新的尖端軟件首先出現(xiàn)在64位平臺

(二)數(shù)據(jù)類型對應(yīng)字節(jié)數(shù)

程序運行平臺

不同的平臺上對不同數(shù)據(jù)類型分配的字節(jié)數(shù)是不同的。

個人對平臺的理解是CPU+OS+Compiler,是因為:

1、64位機器也可以裝32位系統(tǒng)(x64裝XP);

2、32位機器上可以有16/32位的編譯器(XP上有tc是16位的,其他常見的是32位的);

3、即使是32位的編譯器也可以弄出64位的integer來(int64)。

以上這些是基于常見的wintel平臺,加上我們可能很少機會接觸的其它平臺(其它的CPU和OS),所以個人認(rèn)為所謂平臺的概念是三者的組合。

雖然三者的長度可以不一樣,但顯然相互配合(即長度相等,32位的CPU+32位的OS+32位的Compiler)發(fā)揮的能量最大。

理論上來講 我覺得數(shù)據(jù)類型的字節(jié)數(shù)應(yīng)該是由CPU決定的,但是實際上主要由編譯器決定(占多少位由編譯器在編譯期間說了算)。

常用數(shù)據(jù)類型對應(yīng)字節(jié)數(shù)

可用如sizeof(char),sizeof(char*)等得出

32位編譯器:

char :1個字節(jié)

char*(即指針變量): 4個字節(jié)(32位的尋址空間是2^32, 即32個bit,也就是4個字節(jié)。同理64位編譯器)

short int : 2個字節(jié)

int: 4個字節(jié)

unsigned int : 4個字節(jié)

float: 4個字節(jié)

double: 8個字節(jié)

long: 4個字節(jié)

long long: 8個字節(jié)

unsigned long: 4個字節(jié)

64位編譯器:

char :1個字節(jié)

char*(即指針變量): 8個字節(jié)

short int : 2個字節(jié)

int: 4個字節(jié)

unsigned int : 4個字節(jié)

float: 4個字節(jié)

double: 8個字節(jié)

long: 8個字節(jié)

long long: 8個字節(jié)

unsigned long: 8個字節(jié)

最后補充unsigned類型和signed的區(qū)別:

整型的每一種都分為:無符號(unsigned)和有符號(signed)兩種類型(float和double總是帶符號的),在默認(rèn)情況下聲明的整型變量都是有符號的類型(char有點特別),如果需聲明無符號類型的話就需要在類型前加上unsigned。無符號版本和有符號版本的區(qū)別就是無符號類型能保存2倍于有符號類型的正整數(shù)數(shù)據(jù),比如16位系統(tǒng)中一個short能存儲的數(shù)據(jù)的范圍為-32768~32767,而unsigned能存儲的數(shù)據(jù)范圍則是0~65535。由于在計算機中,整數(shù)是以補碼形式存放的。根據(jù)最高位的不同,如果是1,有符號數(shù)的話就是負(fù)數(shù);如果是無符號數(shù),則都解釋為正數(shù)。另外,unsigned若省略后一個關(guān)鍵字,大多數(shù)編譯器都會認(rèn)為是unsigned int。

unsigned正數(shù)表示范圍是signed的2倍

類型

說明

tinyint非常小的整數(shù)

smallint較小整數(shù)

mediumint中等大小整數(shù)

int標(biāo)準(zhǔn)整數(shù)

bigint較大整數(shù)

float單精度浮點數(shù)

double雙精度浮點數(shù)

decimal一個串的浮點數(shù)

每種數(shù)值類型的名稱和取值范圍如下表所示

類型說明 —————————— 取值范圍

tinyint[(m)]

有符號值:-128 到127(- 27 到27 - 1)

無符號值:0到255(0 到28 - 1)1個字節(jié)

smallint[(m)]

有符號值:-32768 到32767(- 215 到215 - 1)

無符號值:0到65535(0 到21 6 - 1)2個字節(jié)

mediumint[(m)]

有符號值:-8388608 到8388607(- 22 3 到22 3 - 1 )

無符號值:0到16777215(0 到22 4 - 1)3個字節(jié)

int[(m)]

有符號值:-2147683648 到2147683647(- 231 到231- 1)

無符號值:0到4294967295(0 到232 - 1)4個字節(jié)

bigint[(m)]

有符號值:-9223372036854775808 到9223373036854775807(- 263到263-1)

無符號值:0到18446744073709551615(0到264 – 1) 8個字節(jié)

float[(m, d)]

最小非零值:±1.175494351e - 38

double[(m,d)]

最小非零值:±2.2250738585072014e - 308

decimal (m, d)

可變;其值的范圍依賴于m 和d

關(guān)于利用c++怎么判斷系統(tǒng)是64位還是32位就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI