2016-03-23 79 views
1

我在我的Mac OS X的XCode 7.2.1嘗試一些無符號長長的意外行爲

value: 18446744073709551615 
ULLONG_MAX: 18446744073709551615 

但輸出是 -

value: 0 
ULLONG_MAX: 18446744073709551615 

下面的變化也沒有什麼區別。

uint64 N = 100000ull; 
uint64 value = (pow(N, 4ull) + 2ull * pow(N, 3ull) + 3ull * pow(N, 2ull) + 2ull * N)/4ull; 

在我的終端產量運行gcc --version命令 -

Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 
Apple LLVM version 7.0.2 (clang-700.1.81) 
Target: x86_64-apple-darwin15.0.0 
Thread model: posix 

我試圖上面Hackerrank克++編譯器4.9.2碼和輸出是正確的。

發生了什麼?是Clang還是我的操作系統(Mac OS X 10.11)?

+2

如果您將'long double'分配給您,您會看到結果是_not_'ULLONG_MAX'。相反,它會溢出。 '長雙倍值= pow(N,4.0L)+ 2.0L * pow(N,3.0L)+ 3.0L * pow(N,2.0L)+ 2.0L * N)/ 4.0L;' – paddy

+0

謝謝:) 'long double'可以容納更多的數據,這對於檢查在這種情況下是否發生溢出確實有幫助。 –

回答

4

這是由溢出引起的。您的等式返回:25000500007500050000這對於無符號long long來說很大。

這似乎是鏗鏘處理這與g ++略有不同。我做了一個小測試,看看演員演出後的結果。

參見:Clang giving random valuesg++返回std::numeric_limits<std::uint64_t>::max()。如果你需要這個數字(在一個數據類型中),我會親自建議找到一個支持任意長度數字的庫(gmp或可比較的)。

+1

謝謝。我猜你幾乎是一樣的,只是很高興確定它:)特別是對於我的問題,使用'unsigned long long'處理已通過所有測試用例,所以我不需要處理大整數或類似的事情時間。 –