2015-03-30 41 views
0

所以新的C++數據類型和我看到的東西很奇怪,我不能在互聯網上找到答案:C++的無符號長整型插入STL容器和打印回怪事

std::set<unsigned long> test; 
test.insert(7788994347298743234); 
test.insert(0113); 
std::set<unsigned long>::iterator it; 
for(it = test.begin(); it != test.end(); it++) { 
    std::cout << *it << std::endl; 
} 

輸出:

這是一組具有 「unsigned long int類型」 爲元素類型,其具有0到4,294,967,295的範圍內。現在爲什麼:

  1. 像7788994347298743234這樣的大數字仍然適合設置就好,並打印出來?當你試圖插入一些溢出指定類型容器的數據時,C++的行爲是什麼?它不會拒絕並在插入時返回false?底層使用比32位更多的內存來存儲數據?

  2. 以前導零開頭的任何數字都是無效的?什麼隱式類型轉換已經完成使0113變成75?

我問這些,因爲如果我的設置需要存儲,可能有什麼樣的元素任意前導零,也就是說,CRC32散列的結果(當然只是扔在這裏例子,不知道是否這實際上適用.. 。)?謝謝!

+1

'unsigned long類型int'不能保證有一個範圍。整數字面量的[引用](http://en.cppreference.com/w/cpp/language/integer_literal)不會花太長時間來搜索以零開始的內容。 – chris 2015-03-30 21:16:03

+4

看到http://stackoverflow.com/questions/29325822/c-int-with-preceding-0-changes-entire-value – juanchopanza 2015-03-30 21:16:17

+0

謝謝你們這些鏈接幫助! – Superziyi 2015-03-30 21:27:34

回答

0

好吧看起來像是一個重複的然後。如果管理員認爲合適,請隨時刪除它。快速回答自己與球員的幫助下在評論後:

  1. 細則中指出unsigned long int類型具有「至少32位」,這意味着實際的範圍可以到64位,這取決於機器和編譯器。我正在看這樣的文檔:https://msdn.microsoft.com/en-us/library/s3f49ktz%28v=vs.80%29.aspx,這是特定於視覺工作室,並返回2005.

  2. 顯然,在C++領先的零意味着八進制數。還沒有觸及,因爲學校這個概念,8年前...良好的聯繫,如所指出的評析: http://en.cppreference.com/w/cpp/language/integer_literal C++ int with preceding 0 changes entire value How does C Handle Integer Literals with Leading Zeros, and What About atoi?