[Java]“不同族”基本数据类型间只能“强转”吗?

【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)
https://www.cnblogs.com/cnb-yuchen/p/18298193
出自【进步*于辰的博客

本文阐述需要计算不同位二进制的表示范围,引用博文《[MySQL]知识点》中的【数据范围通式】一栏得出的计算公式。虽然Java与MySQL属不同体系,但是数据类型的“约定”是相同的。因此,大家可以此博文作为参考。
参考笔记二,P65.1。

先言

两个结论:

  1. 数据类型转换分为显式转换和隐式转换两种方式,显式转换属于“强转”。具体何种方式取决于转换前后类型所占字节数的大小。
  2. int类型采用有符号二进制存储,char类型采用无符号二进制存储。

1、int → char

引用那篇博文中关于数据类型数值范围的计算通式:
在这里插入图片描述

int类型占4个字节,char类型占2个字节,先计算一下这两种类型的数值范围:

  1. int类型数值范围:-2{8*4-1} ~ 2{8*4-1} - 1 = -2.147483648E9 ~ 2.147483647E9;(有符号二进制)
  2. char类型取值范围:-2{8*2-1} ~ 2{8*2-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等于 231 - 1,-2147483648等于 -231

float类型的最大和最小值分别是:

Float.MAX_VALUE;// 3.4028235E38
Float.MIN_VALUE;// 1.4E-45

这两个值是如何计算出来的?这涉及到浮点数二进制的计算方法,大家可查阅博文《浮点数(小数)在计算机中如何用二进制存储?》。具体如何计算,我暂无头绪。

对于float与int间转换,只能强转,那有没有限制呢?做个测试:

(int) Float.MAX_VALUE;// 2147483647
(int) Float.MIN_VALUE;// 0

可见,无限制。

最后

暂无言。

本文持续更新中。。。

posted @ 2024-07-12 13:31  进步·于辰  阅读(6)  评论(0编辑  收藏  举报