最近在看 Java,关于类型比较,有一个问题一直想弄清楚。先直接上代码:
public class Main {
public static void main(String[] args) {
// write your code here
int p = (int)(25);
byte q = (byte)(25);
int result = 0;
if (p == q) {
result = 1;
}else{
result = 2;
}
System.out.println("result is "+result);
return;
}
}
当一个 byte 类型变量与 int 类型变量进行比较时,head first java 上面的解释是:
The == operator can be used to compare two variables of any kind, and it simply compares the bits.
if (a == b) {...} looks at the bits in a and b and returns true if the bit pattern is the same (although it doesn ’ t care about the size of the variable, so all the extra zeroes on the left end don ’ t matter).
如果按照这个解释,那么==操作符执行的动作应该是将 byte 的 8bit 与 int 的最低位 8bit 逐位比较,如果两者一模一样,则返回 true。
然而我记得以前看过其他语言,还有两种可能的操作: 第一种是 cast,将占用空间小的变量转换为空间大的变量,比如将本例中 byte 类型的 p 直接 cast 为 int 类型的变量,这中间隐藏了一次强制类型转换的操作。 第二种是 scale up and padding,先将 byte 的 1 字节转换为 int 的 4 字节,然后将 byte 转换后的 int 类型高 2 字节填充为低 2 字节的符号位。 我尝试过将上面代码替换为
int p = (int)(-127);
byte q = (byte)(-127);
打印结果显示 p 和 q 仍然相等,这样的话,第二种应该是不成立的。
又用 c,C#试验,结果类似,唯一不同的是 C#将 byte 类型处理为 unsigned 类型,不允许赋一个负值。
综上,对于此种比较,一共有三种解释:head first 解释,cast 解释,scale up and padding 解释.
如果按照 head first 的解释,那么 byte 型值 6 应该与整形值 53254 相等,因为前者的二进制是 0000 0110,而后者的二进制值是 1101 0000 0000 0110,因为按照该解释是逐位比较,高位不比。用代码进行试验:
int p = (int)(53254);
byte q = (byte)(6);
输出结果是:2,也就是两者并不相等。
想请各位帮我看看,这个是怎么回事?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.