c++ 判断是64位还是32位系统的实例
1、IsWow64Process
确定指定进程是否运行在64位操作系统的32环境(Wow64)下。
语法
BOOLWINAPIIsWow64Process( __inHANDLEhProcess, __outPBOOLWow64Process );
参数
hProcess
进程句柄。该句柄必须具有PROCESS_QUERY_INFORMATION或者PROCESS_QUERY_LIMITED_INFORMATION访问权限
Wow64Process
指向一个bool值,
如果该进程是32位进程,运行在64操作系统下,该值为true,否则为false。
如果该进程是一个64位应用程序,运行在64位系统上,该值也被设置为false。
返回值
如果函数成功返回值为非零值。
如果该函数失败,则返回值为零。要获取扩展的错误的信息,请调用GetLastError.
微软的例子:
#include#include typedefBOOL(WINAPI*LPFN_ISWOW64PROCESS)(HANDLE,PBOOL); LPFN_ISWOW64PROCESSfnIsWow64Process; BOOLIsWow64() { BOOLbIsWow64=FALSE; //IsWow64ProcessisnotavailableonallsupportedversionsofWindows. //UseGetModuleHandletogetahandletotheDLLthatcontainsthefunction //andGetProcAddresstogetapointertothefunctionifavailable. fnIsWow64Process=(LPFN_ISWOW64PROCESS)GetProcAddress( GetModuleHandle(TEXT("kernel32")),"IsWow64Process"); if(NULL!=fnIsWow64Process) { if(!fnIsWow64Process(GetCurrentProcess(),&bIsWow64)) { //handleerror } } returnbIsWow64; } intmain(void) { if(IsWow64()) _tprintf(TEXT("TheprocessisrunningunderWOW64.\n")); else _tprintf(TEXT("TheprocessisnotrunningunderWOW64.\n")); return0; }
注意:使用此函数判断操作系统是32位还是64位并不合适,勉强要用的话,可以指向一个32位进程。
2、比较合适的做法是:
BOOLIs64bitSystem() { SYSTEM_INFOsi; GetNativeSystemInfo(&si); if(si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64|| si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_IA64) returnTRUE; else returnFALSE; }
补充知识:C编程注意32位机器和64位机器的差别及unsigned和signed
1.64bitCPU拥有更大的寻址能力,最大支持到16GB内存,而32bit只支持4G内存
2.64位CPU一次可提取64位数据,比32位提高了一倍,理论上性能会提升1倍。但这是建立在64bit操作系统,64bit软件的基础上的。
C/C++32位机器和64位机器差异问题总结跨平台移植问题语言编程需要注意的64位和32机器的区别
#includeOSversion:RedHatEnterpriseLinuxServerrelease5.3(Tikanga)linux2.6.18-128.el5#1SMPWedDec1711:41:38EST2008x86_64x86_64x86_64GNU/Linux size_t本身一个作用就是避免考虑64还是32。64位下Long和指针是64位的 size_tm_unNo; sprintf(path,"%u",m_unNo);//这句在32位机器上正常64位机器上会编译警告:“警告:格式‘%u'需要类型‘unsignedint',但实参4的类型为‘size_t'” %u对应unsignedint在64位机器上还是32位,而size_t已经变成64位了。 char*指针在64位下是64位 m_pMem=newchar[nSize]; intoff=(int)m_pMem%nAlign;//在32位编译正常,在64位机器上编译报错:“错误:从‘char*'到‘int'的转换损失精度”
改为就可以达到兼容效果了intoff=(uint64_t)m_pMem%nAlign;//因为int在64位下仍为32位,char×已经变位64位了。
一、数据类型特别是int相关的类型在不同位数机器的平台下长度不同。
C99标准并不规定具体数据类型的长度大小,只规定级别。作下比较:
16位平台
char1个字节8位
short2个字节16位
int2个字节16位
long4个字节32位
指针2个字节
32位平台
char1个字节8位
short2个字节16位
int4个字节32位
long4个字节
longlong8个字节
指针4个字节
64位平台
char1个字节
short2个字节
int4个字节
long8个字节(区别)
longlong8个字节
指针8个字节(区别)
二、编程注意事项
为了保证平台的通用性,程序中尽量不要使用long数据库型。可以使用固定大小的数据类型宏定义:
typedefsignedcharint8_t typedefshortintint16_t; typedefintint32_t; #if__WORDSIZE==64 typedeflongintint64_t; #else __extension__ typedeflonglongintint64_t; #endif
三、使用int时也可以使用intptr_t来保证平台的通用性,它在不同的平台上编译时长度不同,但都是标准的平台长度,比如64位机器它的长度就是8字节,32位机器它的长度是4字节,定义如下:
#if__WORDSIZE==64 typedeflongintintptr_t; #else typedefintintptr_t; #endif
编程中要尽量使用sizeof来计算数据类型的大小
以上类型定义都有相应的无符号类型。
另外还有ssize_t和size_t分别是unsigned和signedsizeofcomputerwordsize。
它们也是表示计算机的字长,在32位机器上是int型,在64位机器上long型,从某种意义上来说它们等同于intptr_t和uintptr_t。
它们在stddef.h里面定义。需要注意的是socket的accept函数在有些操作系统上使用size_t是不正确的,因为accept接收的int*类型,而size_t可能是longint类型。后来BSD使用sock_t来替代它。
一、C
1.几条规则
(1)char类型一般是8bit,但ANSIC里没有硬性规定其长度,某些嵌入式编译器可能是16bit
(2)short和long类型的长度不相同
(3)int类型通常同具体机器的物理字长相同
(4)short通常是16bits,int通常是16bitsor32bits每种编译器可以根据硬件的不同自由确定,但是short和int必须最少是16bits,而long类型必须最少是32bits,并且short必须比int和long类型要短。
2.32位机上类型长度
sizeofchar:1 sizeofint:4 sizeoflong:4 sizeoffloat:4 sizeoflonglong:8 sizeofdouble:8 sizeoflongdouble:12 sizeofchar*:4
3.64位机上类型长度
sizeofchar:1 sizeofint:4 sizeoflong:8 sizeoffloat:4 sizeoflonglong:8 sizeofdouble:8 sizeoflongdouble:16 sizeofchar*:8
4.16位机类型长度
char:1 int:2 long:4 unsignedint:2 unsignedshort:2 unsignedlong:4 float:4 sizeofchar*:4
二、C++
1.字节和字长
字节,八位就是一个字节,是固定概念。字长是指计算机一次能处理的二进制数据的长度,是一个非固定的概念。例如,8位计算机的字长为8,即一个字节,32位计算机的字长位32,即4个字节,同理,64位计算机的字长为64,即8字节。
2.char类型始终是一个字节长,即8位。
3.int、shortint和longint
通常int为一个字长,short为半个字长,long为一个或2个字长(在32位机器中为一个字长)。
4.浮点型float、双精度double、和长双精度longdouble
典型情况下,float为一个字,double是两个字,longdouble为三个或四个字。
32位机指针为什么是4个字节64位与32位机的区别
int类型比较特殊,具体的字节数同机器字长和编译器有关。如果要保证移植性,尽量用__int16__int32__int64吧,或者自己typedefintINT32一下。C、C++标准中只规定了某种类型的最小字节数(防止溢出)。
通常的64位技术是相对32位而言的,这个位数指的是CPUGPRs(General-Purposeregister通用寄存器)的数据宽度为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亿),能处理的数字越大,则操作的次数就越少,从而系统的效率就越高。
字长与寻址空间:处理器字长是指处理机能同时处理的位数,处理器的字长越大,则说明它的运算能力越强。
处理的寻址范围:要看处理器的地址总线的位数,而不是它的字长。!!!!!如IntelP4处理器字长为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、64bitCPU拥有更大的寻址能力,最大支持到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位编译器)
shortint:2个字节
int:4个字节
unsignedint:4个字节
float:4个字节
double:8个字节
long:4个字节
longlong:8个字节
unsignedlong:4个字节
64位编译器:
char:1个字节
char*(即指针变量):8个字节
shortint:2个字节
int:4个字节
unsignedint:4个字节
float:4个字节
double:8个字节
long:8个字节
longlong:8个字节
unsignedlong:8个字节
最后补充unsigned类型和signed的区别:
整型的每一种都分为:无符号(unsigned)和有符号(signed)两种类型(float和double总是带符号的),在默认情况下声明的整型变量都是有符号的类型(char有点特别),如果需声明无符号类型的话就需要在类型前加上unsigned。无符号版本和有符号版本的区别就是无符号类型能保存2倍于有符号类型的正整数数据,比如16位系统中一个short能存储的数据的范围为-32768~32767,而unsigned能存储的数据范围则是0~65535。由于在计算机中,整数是以补码形式存放的。根据最高位的不同,如果是1,有符号数的话就是负数;如果是无符号数,则都解释为正数。另外,unsigned若省略后一个关键字,大多数编译器都会认为是unsignedint。
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到216-1)2个字节
mediumint[(m)]
有符号值:-8388608到8388607(-223到223-1)
无符号值:0到16777215(0到224-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位系统的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。