计算机不是补码计算嘛。
b的补码是 1111 1111
i的补码是 1111 1111 1111 1111 1111 1111 1111 1111
为什么这两个相等?
不i同类型的数字比较,首先需要做类型转换,byte需要转换成int再比较,在转换的时候,因为byte的位短,那么遵循的规则就是
如果高位是1,那么在前面补1,如果高位是0,在前面补0
因此 1111 1111 前面补1就是 1111 1111 1111 1111 1111 1111 1111 1111
这个问题也可以换一个角度看,比如我是一个什么都不懂的小白,我使用一种叫做Xava编程语言,这种语言byte的-1、short的-1、int的-1去比较都不同,而 Java这种语言比较是相同,你说你会用哪个语言?语言再怎么设计,用不用补码是内部的事情,目的肯定是要构造一种人类可以理解和学习的语言,而不是处处违反直觉。
这样比较是可以的,但是int会损失精度。
因为不同类型之间的比较,是不行的,Java背后会有一个隐式转换,它会自动给你把byte类型转换为int类型,再比较。
上面有个老哥已经说了,转换规则是最高位是1就在最高位前面补1,是0则补0,你试试就知道,这样补值不会发生变化。
首先你要知道,这个转换,肯定是在尽量保持值不变的情况下进行转换,不管是用8位表示-1,还是32位表示-1,以精度来说,都是足够了的,转换过程中并不会丢失精度,不会像(int)1.2转换成1一样,丢失了小数部分。
所以再强调一遍,这个比较,不是直接拿原数据按位比较,比较必须是相同类型,如果语言中不是相同类型的可以比较,那必然背后有隐式的转换。