兩個整數相乘的結果一定正確嗎?

2021-09-06 23:09:36 字數 1161 閱讀 4831

問題:在我們編寫程式時 ,經常需要進行各種計算,例如:將兩個int型整數的乘積,賦值給乙個 long 型變數,請問這種計算結果一定正確嗎?

當為乙個 long 型變數賦值乙個整數常量時,如果這個整數超過了 int 的取值範圍,程式就會出現編譯錯誤,但是有一種情況程式是不會出錯的,就是將多個 int 型資料進行算術運算的結果 賦值 給 long 型變數,即使這個運算結果超出了 int 的範圍,程式也不會出現編譯錯誤。

說明:乙個 int 在記憶體中占用 4 個位元組的儲存空間,其取值範圍是 -2147483648 ~ 2147483647 之間的整數,而乙個 long 型在記憶體中占用 8 個位元組,取值範圍是 -9223372036854775808 ~ 9223372036854775807 之間的整數。

// 出現編譯錯誤

long num1 = 2147483648;

解釋:上面的示例 為 long 型變數 num1 賦值 2147483648,由於數值超出了 int 的取值範圍,所以程式出現了編譯錯誤,為了能夠正確的賦值,需要在 2147483648 後面加 上 小寫字母 l 或者是 大寫字母 l,這樣示例就不會出錯了。

// 能夠通過編譯,結果錯誤

long num2 = 2147483647 * 10;

system.out.println(num2);// -10

解釋:上面示例輸出為 -10,並不是我們期待的結果 21474836470,這個是由於參加計算的兩個整數都沒有超出 int 的取值範圍 ,所以編譯不會報錯;結果錯誤是由於兩個數的乘積時,是以 int 型資料進行計算的,所以計算結果也應該是 int 型,由於結果超出了 int 的取值範圍,所以程式發生了 溢位,但是程式會保留這個溢位的結果,所以輸出了 -10;

// 既能通過編譯,結果又正確

long num4 = 2147483647l * 10;

system.out.println(num4);

解釋:上面示例輸出為 21474836470,這正是我們期望的結果。這是由於參加計算的兩個整數中第乙個整數後新增了大寫字母 l,這樣表示要進行的運算是按長整數進行的,所以程式不會發生溢位,因此可以計算出正確的結果。

復合賦值運算子 計算的結果一定正確嗎?

接下來是計算 s1 和 s2 的 和值,會發現第乙個方法的計算結果為負數,第二個是正確的。test public void test13 但是把 稍微修改下結果就正確了 test public void test12 解釋下原因 因為在執行 s1 s2時,由於計算結果超出了 short 的取值範圍,...

任意長度的兩個正整數相乘

兩個大數相乘 char multiply char char 給了兩個字串,每個都是代表了乙個很長的10進製表示的數,比如 string str1 23456789009877666555544444 string str2 346587436598437594375943875943875 最後求...

C 中兩個整數相除得到帶小數點的結果

有時候需要將兩個整數相除,獲得帶小數點的float型別數。例如乙個整數12345,需要變成123.45。常見與串列埠與硬體通訊,dsp處理浮點型比較麻煩,dsp傳遞來的溫度等資料都以整型的方式傳遞,串列埠控制項接收到資料後,需要將溫度值變成實際的值,就可能採用這種方式了。例如 int itemp 3...