c++判断程序及操作系统位数

曾经在书上看到过,也被人问起过,搜索过,为了记忆更加深刻,还是写一篇博文吧~

程序位数是将一段程序编译后,程序本身的位数,比如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  
    原文作者:加油努力4ever
    原文地址: https://blog.csdn.net/noricky/article/details/80105857
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞