前面
這是我在刷 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));