PDF 课件和源代码下载地址:
https://gitee.com/geektime-geekbang/LetsJava
作者回复: 恭喜你戳中了一个经典问题。这里是我给出的一个关于补码的解释:https://github.com/geektime-geekbang/LetsJava/blob/master/FAQ/01%E7%AB%A0-%E5%85%B3%E4%BA%8E%E8%A1%A5%E7%A0%81%EF%BC%8C%E5%A4%9A%E8%AF%B4%E4%B8%A4%E5%8F%A5.md 了解了补码,就知道了负数是怎么表示的了。那么正数是最高位的bit为0的数,CPU的加法运算其实并不管这么多,它就是按照二进制进行加法运算,进行进位。所以正数加阿加的溢出了,加到最高位为1了,就会变成负数。因为进位到了最高位(也就是符号位),符号位变成了1,就是负数了。 那为什么是秒从正的二十几亿变成负的20几亿呢?还是因为补码,参见文章中对于补码数字表示的转换方式。
作者回复: dei dei dei,小学养成的坏毛病,一不注意就说错。
作者回复: 我经常嘴上分冒不分,虽然脑子里想的是正确的符号(反之你也不知道
作者回复: 是的, 如果吃不准可以用long. int看着挺大其实一不小心就会溢出
作者回复: 这种情况还是很多的。比如这个课程后面有个聊天程序的例程,接收消息的线程的逻辑就可以是一个while true循环。 还有一些情况,可以将一些线程设置为守护线程,然后while true做一些事情,比如检查状态,打log等。 当然,while true循环也是可以被break出来的。或者可能是类似while(stillworking)的形式存在的。 官方类库也有类似的做法,最典型的就是ThreadPool里的Thread。
作者回复: 因为溢出的时候, 按照二进制加法的逻辑, 会进位, 但是最高位是符号位, 如果为 1 就代表为负数, 正是因为这个符号位, 加着加着太大了, 符号位变为1 就成了负数了.
作者回复: 是的,关系说反了😅
作者回复: 有些就是一样的效果。while循环就这么个语法,就是一遍遍执行while里的代码,直到条件为false。
作者回复: 是的,start只是用一下,用完之后,dividend再怎么变化也跟start没关系了。
作者回复: 代码没有问题,我试了一下,在我的Mac上输出也是正常的,windows应该也没什么问题。这个错误码是操作系统给出的,一般的Java代码是搞不出这种错误的,你可以尝试重启一下。