得到答案,因爲使用它0
試試你原來的一些隱式轉換的發生,大多是不必要的。
unsigned long long int a = 17446744073709551615;
一種無後綴十進制整數字面是int
類型,long int
,或long long int
的;它從來沒有一個無符號類型。該特定值幾乎肯定超過了long long int
(2 -1)的最大值。除非你的編譯器有一個寬度超過64位的有符號整數類型,否則這會使你的程序不合格。
添加ULL
後綴以確保該文字是正確的類型:
unsigned long long int a = 17446744073709551615ULL;
的值正好是2 -1和2 -1之間,所以它在適合一個64位無符號類型,但不是64位有符號類型。
(其實只是U
就足夠了,但它不會傷害是明確的。)
signed long long int b = -30000000003;
這不應該是一個問題。 30000000003
是一些有符號的整數類型;如果您的編譯器支持至少64位寬的long long
,則不會發生溢出。不過,只要你需要的a
值後綴,它不會傷害是明確的:
signed long long int b = -30000000003LL;
現在我們有:
signed int c;
c = a/b;
分割一unsigned long long
由signed long long
導致帶符號的操作數將被轉換爲unsigned long long
。在這種情況下,被轉換的值是負值,所以它被轉換爲一個大的正值。將-30000000003
轉換爲unsigned long long
得到18446744043709551613
。將17446744073709551615
除以18446744043709551613
得到零。
除非你的編譯器支持64位以上的整數寬(最不),你將不能夠直接分通過17446744073709551615
和-30000000003
得到一個數學上正確的答案,因爲沒有能夠代表兩個整數類型值。所有算術運算符(除換算運算符外)都需要相同類型的操作數,並根據需要應用隱式轉換。
在這種特殊情況下,您可以將17446744073709551615ULL
除以30000000003ULL
,然後考慮符號。 (檢查負整數除法的語言規則。)
如果您確實需要這樣做,您可以使用浮點(這意味着您可能會失去一些精度)或使用任意寬度的整數算術包如GMP。
爲什麼需要這麼大和毫無意義的數字? http://coliru.stacked-crooked.com/a/8f7b78a46536e533 – chris
我的猜測是劃分是作爲無符號long long的一個劃分完成的,即b變成了一個非常大的無符號long long。因此結果爲0. – user515430
嘗試首先將'a'轉換爲'signed long long int'。 – herohuyongtao