leetcode奇技淫巧-int最大值與最小值溢出

前面

這是我在刷 leetcode 時候發現的一個問題,做個小記錄

int 類型界限

Java 中 int 類型是 4 個字節,2 進制 32 位,默認是有符號的,所以只有 31 位是有用的,首位用於決定正數還是負數,但是我們發現 int 的界限值如下:

  • int 最大值: 2147483647
  • int 最小值:-2147483648

負數的絕對值比正數大 1

求邊界錯誤代碼

從上面我們可以發現,最小值的絕對值要比最大值大 1,一般這個數字我們也記不住,那我們就直接來求吧

int s = 1;
for (int i = 1; i <= 31; i++) {
	s *= 2;
}
System.out.println(s);

結果是:

-2147483648

這不就是溢出了嘛,這時我們用 0 去減它,它依然不變
當我們再執行 s-1 的時候發現正好就是 int 最大值,所以我們要注意這一點,如果過我們開始另 s=-1,那最後不用加 1 或者減 1 就可以拿到 int 的最小值

求邊界正確代碼

方式一:

先算出最大再算最小

int s = 1;
for (int i = 1; i <= 31; i++) {
	s *= 2;
}
// 最大值
System.out.println(s-1);
// 最小值
System.out.println(0-(s-1)-1);

方式二:

先算出最小,再算最大

int s = -1;
for (int i = 1; i <= 31; i++) {
	s *= 2;
}
// 最小值
System.out.println(s);
// 最大值
System.out.println(0-(s+1));
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章