1. java bytecode
C/C++编译器把源代码编译成汇编代码,Java编译器把Java源代码编译成字节码bytecode。
Java跨平台其实就是基于相同的bytecode规范做不同平台的虚拟机,我们的Java程序编译成bytecode后就可以在不同平台跑了。
.net框架有IL(intermediate language),汇编是C/C++程序的中间表达方式,而bytecode可以说是Java平台的中间语言。
2. ints overflow问题
int溢出 java不会报错 会显示一个错误的值。
3. What is the value of Math.abs(-2147483648)? (2^31 = 2 147 483 648)
the answer is -2147483648.
reason: Java的int的范围是 Integer.MIN_VALUE(-2^31) 到 Integer.MAX_VALUE(2^31-1)。-Integer.MIN_VALUE 的值大于 Integer.MAX_VALUE ,无法正确被Java的int表示。而 -Integer.MIN_VALUE 在32位的范围内的补码表现形式正好跟 Integer.MIN_VALUE 一样 (该答案转自知乎)
举个栗子,Java中32位的int,
最大值为:2147483647, 二进制:01111111111111111111111111111111
最小值为:-2147483648,二进制:10000000000000000000000000000000
而二进制正负转换的方式是反码+1,反码就是正码的所有位数的0和1对换。
-2147483648的二进制正码:10000000000000000000000000000000
-2147483648的二进制反码:01111111111111111111111111111111
-2147483648的二进制反码+1:10000000000000000000000000000000
搞了半天又回来了,所以Math.abs(-2147483648) 等于-2147483648。
关于补码的一点知识补充:https://www.douban.com/note/223507364/ 转自豆瓣 作者百脑
解决完这道题才算真正懂得补码:https://www.zhihu.com/question/28685048 转自知乎