int 在VS debug win32和debugx64下的區別?
我在VS debugx64的情況下寫了下面的代碼
這時候編譯出來的int不是64位嗎,int32的表示範圍是2^31-1(2147483647),而2222222222超出了這個範圍,如果int是32的話就變成負的。所以x64編譯出來的int不是64位的。但是游標移上去顯示的又是64位,這是什麼原因?
MSVC 的數據模型是 ILP32 和 LLP64 ,分別對應 32 和 64 位。
其中 int 為 32 位, long 為 32 位, long long 為 64 位。size_t 在 32 和 64 位下分別是 unsigned int 和 unsigned long long 。
VS 中 int 一定是 32 位。
然後你用游標查看多半是 sizeof(a) 。其類型是 std::size_t ,值為 4 。64 位環境下 size_t 是 unsigned long long 。Ui64 是 MS 擴展的字面量後綴,指定整數為 64 位無符號整數。
其實到這裡就行了。可看可不看的:
可以確定下 2222222222 的類型。http://zh.cppreference.com/w/cpp/language/integer_literal
從此處來看,VS 中 2222222222 的類型只能是 long long 。http://zh.cppreference.com/w/cpp/language/implicit_cast然後用一個 int 範圍外的 long long 值初始化 int 是實現定義行為,此處實現為迴繞。你滑鼠移上去看到的不是a,是sizeof(a),所以那裡寫著的是4Ui64,表示sizeof(a)的大小是4,類型是unsigned int64
我一直不願意記這種區別,所以,只要允許,我就用int8_t, int32_t之類。
本來int是跟操作系統有關,長度是處理器位寬,比如早期16位單片機int是16位,但後來在制定標準時int和long的意義陰差陽錯顛倒了,導致int是固定32位,long與處理器位寬有關。比如gcc和clang的long在32位和64位系統中的長度分別為4和8位元組。儘管如此,由於win32API中的雙字DWORD是宏定以為long,所以VC++中long也恆定32位
VS里不管32位還是64位, 「int」都是32位的,「__int64」是64位的。
推薦閱讀:
※一段程序在gcc 5.4下編譯後,執行發生段錯誤,在gcc 4.4.7下編譯後,執行正常,什麼原因?
※C++在類模板中如何定義友元函數為同類型的模板函數?
※GCC編譯C語言時,如果加的.a庫裡面和C源文件同時有某個函數或者某個全局變數,GCC會用哪個?
※為什麼 C 語言的輸入輸出函數比 C++ 的輸入輸出流要快?
TAG:CC |