22.
@XFLCER,因为老虎可能用的int类型变量保存的,在C语言里,当数值达到最大值(21亿多)时,再加1,就会变成最小值(-21…),这样。
25.
@春风沉醉的晚上,
@XFLCER,
@Cute寂寥,我确定是我亲手把它改成了2147483647,变负数和我无关(虽然我明明是故意的)。
26.
@XFLCER,我来更详细地解释一下正数变负数的原理:
在32位系统中,数字是用32位二进制表示的,也就是4个字节。然而如果用全部32位去表示数,那么我们就无法表示负数,只能表示正数和0,这样我们就得到一个无符号整数。
而为了表示负数,我们人为规定了整数的最高位(第32位)是符号位,当它为0是表示正数,为1时表示负数。
然而在标准加法运算中,一个31位全满的数(2147483647)加1也可以让第32位变成1,于是当整数转字符串函数解析这个整数时,它变成负数(-2147483648)了,于是我们说,这个整数在加1过程中发生了符号位溢出——本来是数的部分跑到符号位去了,导致数被误读了。
不过mysql似乎有保护机制,我刚刚试了试改成2147483647,发现之后即使再刷新,阅读记录也不会继续上涨了。其实我之前确实是直接改成了负数。