【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)
[https://developer.aliyun.com/article/1631323)
出自【进步*于辰的博客】本文阐述需要计算不同位二进制的表示范围,引用博文《[MySQL]知识点》中的【数据范围通式】一栏得出的计算公式。虽然Java与MySQL属不同体系,但是数据类型的“约定”是相同的。因此,大家可以此博文作为参考。
参考笔记二,P65.1。
先言
两个结论:
- 数据类型转换分为显式转换和隐式转换两种方式,显式转换属于“强转”。具体何种方式取决于转换前后类型所占字节数的大小。
- int类型采用有符号二进制存储,char类型采用无符号二进制存储。
1、int → char
引用那篇博文中关于数据类型数值范围的计算通式:
int类型占4个字节,char类型占2个字节,先计算一下这两种类型的数值范围:
int
类型数值范围:-2^{84-1}^ ~ 2^{84-1}^ - 1 =-2.147483648E9 ~ 2.147483647E9
;(有符号二进制)char
类型取值范围:-2^{82-1}^ ~ 2^{82-1}^ - 1 =-32768 ~ 32767
;(有符号二进制)
注:这个取值范围是按照字节长度计算的。实际上,由于char类型对应ASCLL码,ASCLL码是正数,故不能按照有符号二进制的方式进行计算。
char类型由16位无符号二进制表示,故char类型数值范围是:0 ~ 2^{8*2}^ - 1 =0 ~ 65535
。
字节长度:int > char
,故int类型转为char类型属显式转换。但有一个特例:
当转为char类型的整型数据是常量,且数值在char类型的数值范围之内时,可隐式转换。
说明示例:
1、将数值在char类型取值--数值范围内的int常量转为char类型。
char c1 = -1;//----------A
char c2 = 65536//;-------B
char c3 = 0;//-----------C
char c4 = 65535;//-------D
char类型的数值范围是: 0 ~ 65535
。故A、B编译报错,而C、D转换成功。
2、将int
常量转为char
类型。
int a1 = 100;
final int a2 = 100;
char c5 = a1;// 编译报错
char c6 = a2;// 转换成功
尽管100
在char类型的取值范围内,但a1是变量,故编译报错;而a2以及举例1中的都是常量,故转换成功。
2、float与int
float类型与int类型都占4个字节,且都采用有符号二进制进行存储,
int类型的最大和最小值分别是:
Integer.MAX_VALUE;// 2147483647
Integer.MIN_VALUE;// -2147483648
2147483647
等于 2^31^ - 1,-2147483648
等于 -2^31^。
float类型的最大和最小值分别是:
Float.MAX_VALUE;// 3.4028235E38
Float.MIN_VALUE;// 1.4E-45
这两个值是如何计算出来的?这涉及到浮点数二进制的计算方法,大家可查阅博文《浮点数(小数)在计算机中如何用二进制存储?》。具体如何计算,我暂无头绪。
对于float与int间转换,只能强转,那有没有限制呢?做个测试:
(int) Float.MAX_VALUE;// 2147483647
(int) Float.MIN_VALUE;// 0
可见,无限制。
最后
暂无言。
本文持续更新中。。。