曾经在书上看到过,也被人问起过,搜索过,为了记忆更加深刻,还是写一篇博文吧~
程序位数是将一段程序编译后,程序本身的位数,比如32bit。
32bit程序在一般情况下可以在32bit和64bit的操作系统上运行。
下面分别列出获取程序位数和操作系统位数的方法:
程序位数:
通过指针位数即可获得:
sizeof(void*) * 8
操作系统位数:
Windows:
#include <Windows.h>
#include <stdio.h>
#include <tchar.h>
#include <conio.h>
// 安全的取得真实系统信息
VOID SafeGetNativeSystemInfo(__out LPSYSTEM_INFO lpSystemInfo)
{
if (NULL==lpSystemInfo) return;
typedef VOID (WINAPI *LPFN_GetNativeSystemInfo)(LPSYSTEM_INFO lpSystemInfo);
LPFN_GetNativeSystemInfo fnGetNativeSystemInfo = (LPFN_GetNativeSystemInfo)GetProcAddress( GetModuleHandle(_T("kernel32")), "GetNativeSystemInfo");;
if (NULL != fnGetNativeSystemInfo)
{
fnGetNativeSystemInfo(lpSystemInfo);
}
else
{
GetSystemInfo(lpSystemInfo);
}
}
// 获取操作系统位数
int GetSystemBits()
{
SYSTEM_INFO si;
SafeGetNativeSystemInfo(&si);
if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 ||
si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64 )
{
return 64;
}
return 32;
}
int _tmain(int argc, _TCHAR* argv[])
{
const int nBitCode = GetProgramBits();
const int nBitSys = GetSystemBits();
_tprintf(_T("I am a %dbit Program, run on %dbit System."), nBitCode, nBitSys);
//
_getch();
return 0;
}
注:
1.GetNativeSystemInfo是Windows XP的新增API,用于取得真实系统信息。(32位程序运行在64位系统上时,GetSystemInfo返回的是经过WOW64修改后的信息)
2.IsWow64Process用于判断某进程是否运行在WOW64下。对于64位程序,Wow64Process参数会返回FALSE
Linux:
貌似系统没有直接的api,大家通过shell脚本获取到信息后,传入文件。
通过shell自动生成一个头文件fdfs_os_bits.h,头文件中通过宏OS_BITS来定义操作系统的位数(32或者64)。在Linux中已经调试通过。
shell代码片断如下:
tmp_src_filename=fdfs_check_bits.c
cat <<EOF > $tmp_src_filename
#include <stdio.h>
int main()
{
printf("%d\n", sizeof(long));
return 0;
}
EOF
cc $tmp_src_filename
bytes=`./a.out`
/bin/rm -f a.out $tmp_src_filename
if [ "$bytes" -eq 8 ]; then
OS_BITS=64
else
OS_BITS=32
fi
cat <<EOF > common/fdfs_os_bits.h
#ifndef _FDFS_OS_BITS
#define _FDFS_OS_BITS
#define OS_BITS $OS_BITS
#endif
EOF