首先讨论这个有意义吗?
我想没有。
有意思吗?
很有意思。
为什么没有意义?
- 因为这个东西是人定义的,一些老机子上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型的变量存储的。