这个多重转型的的程序的行为紧密依赖于转型的符号扩展行为。java使用了基于2的补码的二进制运算,因此int类型的数值-1的所有32位都是置位的。从int到byte的转型是简明的,它执行了一个窄化原生类型转换,直接将除低8位之外的所有位全部砍掉。这样留下的是一个8位都是置位的byte,它仍旧表示-1。
从byte到char的转型则稍微麻烦一点,因为byte是有符号类型,而char是无符号类型。在将一个整数类型转换成另一个宽度更高的整数类型时候,通常是可以保持其数值的,但是却不可能从一个char表示一个负的byte数值。因此,我们认为从byte到char的转换不是一个拓宽原生类型转换,而是一个拓宽并窄化原生类型的转换:byte被转化成int,而这个int又被转换成char。
所有这些听起来有些复杂,幸运的是,有一条简单的规则能够描述从较窄的整型转换成较宽的整型时候的符号扩展行为:如果最初的数值类型是有符号的,那么就执行符号扩展;如果他是char,那么不管它将要被转换成什么类型,都执行零扩展。
因为byte是有符号类型,所以在将byte数值-1转换成char时候,会发生符号扩展。作为结果的char数值的16位都被置位了,因此它等于2的16次幂-1,即65535.从char到int的转型是一个拓宽原生类型转换,所以这条规则告诉我们,它将执行零扩展而不是符号扩展。作为结果的int数值也就成了65535,这正是程序打印的结果。
尽管这条规则描述了在有符号和无符号整数之间进行拓宽原生类型时候的符号扩展行为,最好不要编写依赖它的程序。如果你正执行一个转型从char到char的转型的拓宽原生类型转换。并且这个char是仅有的无符号整型,那么最好将你的意图明确表达出来。
如果你在将一个char数值c转型为一个宽度更宽的类型,并且不希望有符号扩展,那么为清晰表达意图,可以考虑一个位掩码:
int i=c & 0xffff;
如果你通过观察不能确定程序将要做什么,那么它做的就有可能不是你想要的。
分享到:
相关推荐
本文将针对"java解惑--疑难问题解疑"的主题,对一些常见的Java疑难问题进行详细解析,旨在帮助初学者更好地理解和解决这些问题。 1. **内存管理与垃圾回收**:Java通过自动垃圾回收机制来管理内存,这为开发者减轻...
### Java解惑——语法细节介绍 #### 概述 Java作为一种广泛应用的编程语言,拥有庞大的用户群体和丰富的应用场景。在日常开发过程中,我们往往会遇到一些容易忽视却又十分重要的语法细节。这些细节虽然不起眼,但...
《Java解惑——最后的笑声》这篇博文主要探讨了Java编程中一些常见但往往被忽视的问题,这些问题可能会在开发过程中导致意料之外的错误或性能瓶颈。作为一个专业的IT大师,我将深入解析这些知识点,帮助你更好地理解...
表达式之谜,符号之谜,循环之谜,异常之谜,类之谜,库之谜,各种谜题。
java 解惑 java 解惑 java 解惑 java 解惑 java 解惑 java 解惑
《Java解惑(中文版)》是一本专为Java初学者设计的学习资料,旨在帮助读者解答在学习Java过程中遇到的各种困惑。"solve65p"可能代表这本书包含65个问题或主题,每个都深入浅出地进行了讲解,旨在解决初学者在编程...
然而,学习Java的过程中,初学者或经验丰富的开发者都可能会遇到一些棘手的问题,这就是"Java学习利器-JAVA解惑"想要解决的问题。 这份名为"JAVA解惑"的PDF文档,可能是由一位经验丰富的Java开发者或者教育者编写的...
《Java解惑》是一本专为Java初学者和进阶者设计的指南,旨在帮助读者解决在学习和实践中遇到的各种问题。这本书深入浅出地解析了Java编程中的常见困惑,涵盖了语言基础、类库应用、多线程、网络编程、异常处理、内存...
《Java解惑(中文)》是一本专注于解决Java编程中常见问题和困惑的资源集合,旨在帮助初学者和有经验的开发者更好地理解和掌握Java语言。本文将深入探讨Java编程中的关键概念、常见问题以及解决方案。 1. **Java...
《Java解惑中文版》是一本专为Java程序员设计的指南,旨在帮助读者解决在编程过程中遇到的各种问题,提升程序的健壮性。本书深入浅出地探讨了Java语言的核心概念、常见疑惑以及最佳实践,旨在使开发者能够编写出更...
"JAVA解惑"的主题针对的是Java学习过程中遇到的一些常见问题和难点,旨在帮助开发者深入理解和解决这些问题。以下是基于这个主题和描述可能涵盖的一些关键知识点: 1. **Java基础**:这可能包括变量、数据类型、...
《Java解惑》 布洛克 著;陈昊鹏 译 扫描清晰带目录,仅供参阅,请支持正版
Java PUZZLE Java 解惑 Java PUZZLE Java 解惑 Java PUZZLE Java 解惑Java PUZZLE Java 解惑 Java PUZZLE Java 解惑 Java PUZZLE Java 解惑
这份“Java解惑.pdf”文档很可能包含了解决Java开发者在编程过程中遇到的常见问题和困惑的详细解答。以下是可能涵盖的一些Java相关知识点: 1. **基础语法**:Java的基础语法包括变量、数据类型、运算符、流程控制...
"java解惑" PDF版本