数论
1. 数字题
注意事项:
- 0、负数、小数
- 是否需要考虑错误输入,错误输入以后应该如何处理
- 数据大小,类型范围
- int 占 4个字节,共 32位:2 ^ 32 = 4,294,967,296
- JAVA中没有无符号的数,换言之,java中的数都是有符号的
- 在计算机运算的时候,都是以 补码 的方式来运算的
- 当我们看运算结果时,要看它的原码
Java语言中int类型的数据占4个字节,那么4个字节所能表示的最大整数是多少呢?按照补码的表示规则,这个最大的整数存储到计算机当中应该是“1个0跟31个1”: 【即:2 ^ (32 - 1)- 1 = 2147483647】
如果我们强行给这个数再加1,按照二进制的进位规则,它会变成下面的样子: 【补码形式表示的负数】
原码 = ~(反码) = ~(补码 - 1)
补码 - 1 如下图:
再取反 【表面上,这个二进制数和逆运算之前是一样的,但是它的意义已经完全不同了】 - 在进行逆运算之前,这个二进制数是一个补码形式表示的负数
- 而经过逆运算之后,这个二进制数变成了一个绝对值,既然是绝对值,它肯定不会是负数。因此,这个二进制数最前面的1并不表示负数,而是数字的一部分。
- 那么这个绝对值是多少呢?转换成十进制就是2147483648 【2 ^ (32 - 1)】。所以,我们图3中看到的那个“1开头后面跟着31个0”所表示的负数,就是-2147483648!
| | 1 1 1 1 |
| ----------------- | ---------------------------- |
| 当前位置1代表的值 | 2^(n - 1) 【8、4、2、1】 |
| 求和 | (2 ^ n) - 1 【n:1的个数】 |
得出个小结论:
2 ^(n - 1) - 【2^(n - 1) - 1】= 1
- 当前位置代表的值 - 低位所有和 = 1
- 数据大小是否会溢出
| INT_MIN 0x80000000 | INT_MAX 0x7fffffff|
| ------------------ | ----------- |
| -2147483648 | 2147483647|