A. vc++是多少位的編譯器啊,怎麼能編譯16位的控制台程序
32位,兼容16位
B. C語言問題 求位前輩 對於操作系統的字長是多少位 和C語言的關系不是很很了解
首先需要知道的是CPU字長(機器字長),這個是硬體決定的,指cpu同時參與運算的二進制位數,機器字長直接決定著機器可定址的虛擬空間地址大小。常見的機器字長有16位,32位,64位等。
其次是操作系統字長。 操作系統字長就是操作系統的位數,對於電腦操作系統來說,有32位64位兩種。操作系統字長是軟體的概念,依賴於硬體,但不一定相同。64位機器字長上可以安裝32位的操作系統,但是反之則不行。即操作系統字長不可高於機器字長。
C語言的編譯器是運行於操作系統之上的軟體,所以編譯器依賴於操作系統。編譯器字長不可高於操作系統。
C語言編譯器的字長,影響C語言的編譯運行,由C語言編譯器編譯出的可執行文件的運行字長,不能高於編譯器字長。
於是,綜合這幾個的關系,就是
C語言編譯出的軟體字長 ≤ C語言編譯器字長 ≤ 操作系統字長≤機器字長。
C. VC++6.0編譯系統中,char這種數據類型的取值范圍是-128~127.這是怎樣計算的
char是單
位元組
有
符號
類型,即數據有8位
二進制數
,而且最高位用作符號位.
10000000-11111111表示-128到-1,00000000-01111111表示0-127
D. VC++6.0編譯出的程序支持系統到多少
VC6編譯的是win32的32位系統程序,目前win7、win8都是兼容x64/x86模式的系統,標准win32程序可以在上面運行(以兼容模式)。
當然,要看程序使用了什麼組件、控制項和系統介面,有些介面在新系統下有了調整,那麼這個程序就不能使用了。一般簡單的邏輯和界面程序都是沒什麼問題的。
簡單的說,VC6編譯的程序,和XP下大部分軟體沒有什麼不同,多數可以在win7/win8下使用,而少部分不可使用。
E. vc6.0環境下的程序可以在vs2010中進行64位編譯嗎
越復雜的程序,這種升級難度越高。
小程序,通過小改動甚至不改動,也可以完成64位編譯,但大型程序,很多甚至沒有可升級性,不如重做。
一般來說,如果不是必要,推薦升級到2010後進行32位編譯,這樣多數程序可以直接編譯通過(除非使用了不再兼任的功能),但升級64位,涉及的東西太多,很難直接完成編譯。
F. vc6.0程序怎樣編譯成64位
Microsoft Platform SDK 2001年 11 月版或更高版本
VisualC++ 6.0
步驟一:安裝最新適合xp的SDK
通過雙擊SDK文件夾下面的Setup.Exe安裝Microsoft Platform SDK到硬碟任意目錄後,安裝程序會在開始菜單中生成Microsoft Platform SDK的快捷方式。單擊"start->AllPrograms->Microsoft Platform SDK for Windows Sever 2003 SP1->Open BuildEnvironment Window->Set Windows XP 64 Build Environment->Set Windows XP64 Build Environment (Debug) 此時將顯示一個控制台窗口,其中帶有為 64 位內部版本設置的內部版本環境。
步驟二:從64位內部版本環境啟動Visual C++6.0:
啟動MicrosoftPlatform SDK後,直接在命令行輸入msdev/useenv,此時將顯示 Visual C++ 6.0 IDE,其中已經為 64 位內部版本環境設置了 include、library和executable 目錄。 (如果Msdev.exe不在路徑中,請將文件夾更改到 \Microsoft Visual Studio\Common\Msdev98\Bin文件夾,然後運行 msdev/useenv)
Visual C++啟動成功後,可以通過菜單Tools->Options->Directories查看Include files和Library file的默認路徑應為Microsoft Platform SDK文件夾下的include和lib文件夾,此時為打開正確的64位虛擬編譯環境。否則需重啟打開。
步驟三:添加 64位調試配置:
♦在 Visual C++ IDE中,打開現有的 32 位項目(例如,MyApplication)。
♦在"Build"菜單上,單擊"Configurations"。
♦在"Configurations"對話框中,單擊"add"。
♦在"Add Project Configuration"對話框中,將"Configuration"設置為 Debug64,單擊"OK",然後單擊"Close"。
步驟四:將活動配置設置為 64位:
♦在"Build"菜單上,單擊"Set Active Configuration"。
♦單擊"MyApplication- Win32 Debug64",然後單擊"OK"。
步驟五:修改編譯器或鏈接器選項:
♦在"Project"菜單上,單擊"settings"。
♦在"project settings"對話框中,單擊"General"選項卡。在"outputdirectories"下,在"Intermediate files"框和"output files"框中鍵入 Debug64。
♦在"C/C++"選項卡上,在"Debug info"列表中選擇"ProgramDatabase(編譯器選項,/Zi)"。在Project Options中去掉/GZ,加入/Wp64。
♦在"Link"選項卡上,在"Project Options"框中將 /machine:I386更改為/machine:AMD64。在Object/librarymoles中加入bufferoverflowu.lib,如果不加bufferoverflowu.lib,鏈接時會報錯。
♦在"View"菜單上,單擊"Workspace"。 要從項目中刪除MyApplication.hpj 文件。
♦生成64位程序:
註:在32位機上只能編譯連接生成64位程序,而不能進行調試。
G. 在VC++6.0的編譯器中,整形和長整型的長度各是多少
用下面的代碼可以計算:
printf("size of int is %d.\n", sizeof(int));
printf("size of long int is %d.\n", sizeof(long int));
可以看出在vc中,int 和 long int都是4個位元組。
希望能幫到你。
H. 如何在各個版本的VC及64位下使用CPUID指令
一、推薦使用__cpuid、__cpuidex等Intrinsics函數
在32位模式下,我們可以使用內嵌匯編來調用cpuid指令。但在64位模式下,VC編譯器不支持內嵌匯編。
於是微軟提供了Intrinsics函數——編譯器會將Intrinsics函數編譯為對應的機器指令,而且同時支持32位和64位。
例如CPUID指令的對應Intrinsics函數是——
[cpp] view plain
// http://msdn.microsoft.com/en-us/library/hskdteyh.aspx
void __cpuid(
int CPUInfo[4],
int InfoType
);
void __cpuidex(
int CPUInfo[4],
int InfoType,
int ECXValue
);
__cpuidex函數的InfoType參數是CPUID指令的eax參數,即功能ID。ECXValue參數是CPUID指令的ecx參數,即子功能ID。CPUInfo參數用於接收輸出的eax, ebx, ecx, edx這四個寄存器。
早期的CPUID功能只需要一個功能ID參數(eax),這時可以使用__cpuid函數。
後來CPUID的功能越來越強大,一個功能ID參數(eax)參數不夠用,於是加了一個子功能ID(ecx)參數,這時應該採用__cpuidex。
二、用條件編譯判斷VC編譯器對Intrinsics函數的支持性(_MSC_VER)
在__cpuid、__cpuidex等Intrinsics函數時,會遇到以下問題——
1.低版本的VC編譯器沒有intrin.h頭文件。【注】:只有VC2005(或更高)才擁有intrin.h,支持__cpuid。
2.低版本的VC編譯器不支持__cpuidex。【注】:只有VC2008的部分版本及VS2010(或更高)的intrin.h中才有__cpuidex。
這時可以使用條件編譯來判斷VC編譯器的版本。
_MSC_VER是微軟C/C++編譯器——cl.exe編譯代碼時預定義的一個宏,它的值表示cl的版本,它的類型是「int」。例如——
#if _MSC_VER >=1200 // VC++6.0以上
#if _MSC_VER >=1300 // VC2003以上
#if _MSC_VER >=1400 // VC2005以上
#if _MSC_VER >=1500 // VC2008以上
#if _MSC_VER >=1600 // VC2010以上
例如發現_MSC_VER大於等於1400時,我們可以#include <intrin.h>。然後再利用_MSC_VER進一步判斷__cpuid、__cpuidex的支持性。
三、用條件編譯判斷64位模式(_WIN64)
使用_WIN64這個預處理宏可用來判斷目標平台是不是64位。
雖然在編譯x64平台的程序時,編譯器會自動推導出_WIN64。但是Visual Studio的語法高亮不清楚這些,它有可能仍是按32位代碼來做語法高亮。所以,建議還是手動在項目的預處理宏中增加_WIN64。
四、32位下用內嵌匯編實現__cpuidex函數
在32位模式下,我們可以使用內嵌匯編來實現__cpuidex函數。代碼如下——
[cpp] view plain
void __cpuidex(INT32 CPUInfo[4], INT32 InfoType, INT32 ECXValue)
{
if (NULL==CPUInfo) return;
_asm{
// load. 讀取參數到寄存器
mov edi, CPUInfo; // 准備用edi定址CPUInfo
mov eax, InfoType;
mov ecx, ECXValue;
// CPUID
cpuid;
// save. 將寄存器保存到CPUInfo
mov [edi], eax;
mov [edi+4], ebx;
mov [edi+8], ecx;
mov [edi+12], edx;
}
}
五、全部代碼
全部代碼——
[cpp] view plain
#include <Windows.h>
#include <stdio.h>
#include <tchar.h>
#if _MSC_VER >=1400 // VC2005才支持intrin.h
#include <intrin.h> // 所有Intrinsics函數
#endif
char szBuf[64];
INT32 dwBuf[4];
#if defined(_WIN64)
// 64位下不支持內聯匯編. 應使用__cpuid、__cpuidex等Intrinsics函數。
#else
#if _MSC_VER < 1600 // VS2010. 據說VC2008 SP1之後才支持__cpuidex
void __cpuidex(INT32 CPUInfo[4], INT32 InfoType, INT32 ECXValue)
{
if (NULL==CPUInfo) return;
_asm{
// load. 讀取參數到寄存器
mov edi, CPUInfo; // 准備用edi定址CPUInfo
mov eax, InfoType;
mov ecx, ECXValue;
// CPUID
cpuid;
// save. 將寄存器保存到CPUInfo
mov [edi], eax;
mov [edi+4], ebx;
mov [edi+8], ecx;
mov [edi+12], edx;
}
}
#endif // #if _MSC_VER < 1600 // VS2010. 據說VC2008 SP1之後才支持__cpuidex
#if _MSC_VER < 1400 // VC2005才支持__cpuid
void __cpuid(INT32 CPUInfo[4], INT32 InfoType)
{
__cpuidex(CPUInfo, InfoType, 0);
}
#endif // #if _MSC_VER < 1400 // VC2005才支持__cpuid
#endif // #if defined(_WIN64)
// 取得CPU廠商(Vendor)
//
// result: 成功時返回字元串的長度(一般為12)。失敗時返回0。
// pvendor: 接收廠商信息的字元串緩沖區。至少為13位元組。
int cpu_getvendor(char* pvendor)
{
INT32 dwBuf[4];
if (NULL==pvendor) return 0;
// Function 0: Vendor-ID and Largest Standard Function
__cpuid(dwBuf, 0);
// save. 保存到pvendor
*(INT32*)&pvendor[0] = dwBuf[1]; // ebx: 前四個字元
*(INT32*)&pvendor[4] = dwBuf[3]; // edx: 中間四個字元
*(INT32*)&pvendor[8] = dwBuf[2]; // ecx: 最後四個字元
pvendor[12] = '\0';
return 12;
}
// 取得CPU商標(Brand)
//
// result: 成功時返回字元串的長度(一般為48)。失敗時返回0。
// pbrand: 接收商標信息的字元串緩沖區。至少為49位元組。
int cpu_getbrand(char* pbrand)
{
INT32 dwBuf[4];
if (NULL==pbrand) return 0;
// Function 0x80000000: Largest Extended Function Number
__cpuid(dwBuf, 0x80000000);
if (dwBuf[0] < 0x80000004) return 0;
// Function 80000002h,80000003h,80000004h: Processor Brand String
__cpuid((INT32*)&pbrand[0], 0x80000002); // 前16個字元
__cpuid((INT32*)&pbrand[16], 0x80000003); // 中間16個字元
__cpuid((INT32*)&pbrand[32], 0x80000004); // 最後16個字元
pbrand[48] = '\0';
return 48;
}
int _tmain(int argc, _TCHAR* argv[])
{
//__cpuidex(dwBuf, 0,0);
//__cpuid(dwBuf, 0);
//printf("%.8X\t%.8X\t%.8X\t%.8X\n", dwBuf[0],dwBuf[1],dwBuf[2],dwBuf[3]);
cpu_getvendor(szBuf);
printf("CPU Vendor:\t%s\n", szBuf);
cpu_getbrand(szBuf);
printf("CPU Name:\t%s\n", szBuf);
return 0;
}
六、兼容性說明
VC編譯器對32/64位的支持性——
32位:VC6是最早支持編譯32位Intrinsics函數的。
64位:VC2005是最早支持編譯64位Intrinsics函數的。
本文方法在32位編譯器下的兼容性——
__cpuid:兼容VC6(或更高)。
__cpuidex:兼容VC6(或更高)。
本文方法在64位編譯器下的兼容性——
__cpuid:兼容VC2005(或更高)。
__cpuidex:兼容VC2010(或更高)。
I. vc判斷是32位編譯還是64位編譯判斷是debug編譯還是release編譯
1.判斷是debug編譯還是release編譯。
如果_DEBUG定義了表示是debug編譯,否則是release編譯。
2.判斷是32位編譯還是64位編譯。
在 Win32 配置下,_WIN32 有定義,_WIN64 沒有定義。在 x64 配置下,兩者都有定義。即在 VC 下,_WIN32 一定有定義。
因此,WIN32/_WIN32 可以用來判斷是否 Windows 系統(對於跨平台程序),而 _WIN64 用來判斷編譯環境是 x86 還是 x64。附一個表:
常量\定義 預定義選項 Windows.h VC編譯器
WIN32 Win32 √(minwindef.h) ×
_WIN32 × × √
_WIN64 × × x64
最後附上根據相應編譯情況,進行有條件的鏈接相應靜態庫的示例代碼,其實就是一些宏定義語句的使用:
[cpp] view plain在CODE上查看代碼片派生到我的代碼片
#include "json/json.h"
#ifdef _DEBUG
#ifndef _WIN64
#pragma comment(lib,"json/json_mtd.lib")
#else
#pragma comment(lib,"json/json_mtd_x64.lib")
#endif
#else
#ifndef _WIN64
#pragma comment(lib,"json/json_mt.lib")
#else
#pragma comment(lib,"json/json_mt_x64.lib")
#endif
#endif
using namespace Json;
J. VC2005如何設置可以兼容32位程序的編譯
新建項目,點擊VisualC++,在右邊選擇Win32控制台應用程序,輸入項目名稱,下一步……(按你自己的需要去做,但vc2005的語法和vc6.0的有些差別了,要注意哦~~~)