查找程序的输出
public class Multicast { public static void main(String[] args) { System.out.println(( int ) ( char ) ( byte ) - 1 ); } } |
这个程序无论你用什么方式来划分都会让人困惑。它从int值-1开始,然后将int转换为字节,然后转换为字符,最后转换回int。第一次转换将值从32位缩小到8位,第二次转换将值从8位扩大到16位,最后一次转换将值从16位扩大到32位。该值是否会回到其起始位置?如果你运行了这个程序,你会发现它没有。它会打印 65535 让我们一步一步地理解这一点:- 1. 该程序的行为在很大程度上取决于演员的符号扩展行为。Java使用2的补码二进制算法,因此int值-1设置了所有32位。
2. 从int到byte的转换非常简单。它执行缩小原语转换,只需删除除低阶8位以外的所有位。这将保留一个字节值,并设置所有8位,这(仍然)表示-1。
3. 从字节到字符的转换比较复杂,因为字节是一个 签署 类型和字符 未签名 。通常可以在保留数值的同时从一种整数类型转换为更宽的整数类型,但不可能将负字节值表示为字符。因此,从字节到字符的转换不被视为加宽原语转换,而是加宽和缩小原语转换:字节转换为int,int转换为char。 所有这些听起来可能有点复杂。幸运的是,有一个简单的规则描述了从较窄的整数类型转换为较宽的整数类型时的符号扩展行为:如果原始值的类型是有符号的,则执行符号扩展;如果是字符,则扩展名为零,而不管转换为什么类型。知道了这个规则就很容易解决这个难题。因为字节是有符号类型,所以在将字节值-1转换为字符时会出现符号扩展。结果char值设置了所有16位,因此等于65535。
4. 从char到int的转换也是一种扩展的原语转换,因此规则告诉我们执行零扩展而不是符号扩展。 得到的int值是65535,这正是程序打印的值。
参考资料: Java拼图书
本文由 Shubham Juneja .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 贡献极客。组织 或者把你的文章寄到contribute@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。
如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。