首先討論這個有意義嗎?
我想沒有。
有意思嗎?
很有意思。
為什么沒有意義?
- 因為這個東西是人定義的,一些老機子上int型是2個字節,現在大多數是4個字節32位,數據范圍為-2147483648 ~ 2147483647[-2^31 ~ 2^31-1]
- 可以自行查看自己的機子int型是幾個字節
#include <stdio.h>
int main()
{
printf("%d ",sizeof(int));
return 0;
}
為什么有意思?
因為我們可以自己試出來,思路如下:
- 定義 int a=1;
- 在1后邊不斷加0,直到打印a出現亂的數字
- 得到一個不亂的10^n形式的最大值1000000000
- 再從最高位開始試,每位可以從0到9試一下(最高位從1到9),超出范圍,就取未超范圍的最大值更新一下a的值
- 當然用二分法更好,但我認為10以內的用二分寫程序用牛刀了
- 計算機如何判斷是否超出范圍呢?
- 這遠沒我想象的簡單,因為超出范圍得出的數并不是隨機數,如2000000000+2000000000超出了范圍,你又減取2000000000,結果還是2000000000。
- 我的想法是除去最高位加一次,得到的值與直接相加的結果一定位數相比較。不過這個方法優缺點,存在很小的意外情況。
我為啥閑得蛋疼研究這個?
- 因為我玩爐石的時候周卓加翻倍翻了29次我的周卓居然死了。(周卓本身4血翻倍29次應該是2的31次方,而int型最大值是2^31-1)
- 看來爐石隨從的血量,生命值啥的是用int型的變量存儲的。