91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

利用c++怎么判斷系統是64位還是32位

發布時間:2020-12-11 14:39:32 來源:億速云 閱讀:587 作者:Leah 欄目:開發技術

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

1、IsWow64Process

確定指定進程是否運行在64位操作系統的32環境(Wow64)下。

語法

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

參數

hProcess

進程句柄。該句柄必須具有PROCESS_QUERY_INFORMATION 或者 PROCESS_QUERY_LIMITED_INFORMATION 訪問權限

Wow64Process

指向一個bool值,

如果該進程是32位進程,運行在64操作系統下,該值為true,否則為false。

如果該進程是一個64位應用程序,運行在64位系統上,該值也被設置為false。

返回值

如果函數成功返回值為非零值。

如果該函數失敗,則返回值為零。要獲取擴展的錯誤的信息,請調用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;
  }

注意:使用此函數判斷操作系統是32位還是64位并不合適,勉強要用的話,可以指向一個32位進程。

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內存,而32bit只支持4G內存

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

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

#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 對應 unsigned int在64位機器上還是32位,而size_t已經變成64位了。
char* 指針在64位下是64位
m_pMem = new char[nSize];
int off = (int)m_pMem%nAlign; // 在 32位編譯正常,在64位機器上編譯報錯:“ 錯誤:從 ‘char*' 到 ‘int' 的轉換損失精度”

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

一、數據類型特別是int相關的類型在不同位數機器的平臺下長度不同。

C99標準并不規定具體數據類型的長度大小,只規定級別。作下比較:

16位平臺

char 1個字節8位

short 2個字節16位

int 2個字節16位

long 4個字節32位

指針 2個字節

32位平臺

char 1個字節8位

short 2個字節16位

int 4個字節32位

long 4個字節

long long 8個字節

指針 4個字節

64位平臺

char 1個字節

short 2個字節

int 4個字節

long 8個字節(區別)

long long 8個字節

指針 8個字節(區別)

二、編程注意事項

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

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來保證平臺的通用性,它在不同的平臺上編譯時長度不同,但都是標準的平臺長度,比如64位機器它的長度就是8字節,32位機器它的長度是4字節,定義如下:

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

編程中要盡量使用sizeof來計算數據類型的大小

以上類型定義都有相應的無符號類型。

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

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

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

一、C

1.幾條規則

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

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

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

(4)short通常是16bits, int通常是16bits or 32bits每種編譯器可以根據硬件的不同自由確定, 但是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.字節和字長

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

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

3.int、short int和long int

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

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

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

32位機指針為什么是4個字節 64位與32位機的區別

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

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

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

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

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

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

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

一)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個字節

最后補充unsigned類型和signed的區別:

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

unsigned正數表示范圍是signed的2倍

類型

說明

tinyint非常小的整數

smallint較小整數

mediumint中等大小整數

int標準整數

bigint較大整數

float單精度浮點數

double雙精度浮點數

decimal一個串的浮點數

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

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

tinyint[(m)]

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

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

smallint[(m)]

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

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

mediumint[(m)]

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

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

int[(m)]

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

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

bigint[(m)]

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

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

float[(m, d)]

最小非零值:±1.175494351e - 38

double[(m,d)]

最小非零值:±2.2250738585072014e - 308

decimal (m, d)

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

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

汝城县| 滦南县| 商城县| 商洛市| 宁陕县| 襄城县| 高陵县| 招远市| 寿阳县| 兴安县| 台东县| 英山县| 盐源县| 达尔| 桐乡市| 平塘县| 原平市| 余干县| 蒲江县| 遵义县| 彭州市| 冷水江市| 卓尼县| 珲春市| 阜城县| 达拉特旗| 策勒县| 枝江市| 桐城市| 长治县| 讷河市| 车致| 丰顺县| 尚志市| 措勤县| 鹤庆县| 扬州市| 左贡县| 瑞安市| 华阴市| 客服|