2019.03.06问题及解析

基本数据类型均可任意相互转换吗?为什么?

1.相关知识

这个问题我们首先需要知道基本数据类型有哪些

一共是八种四个大类

  • 整型
    byte、short、int、long
  • 浮点型
    float、double
  • 字符型
    char
  • 布尔型
    boolean

    那么看到这里答案已经很明显了,布尔类型和其他几种基本数据类型是不可以相互转换的。但是只学到这里显然不是我们的风格。

那么其它几个类型之间的相互转换还需要注意些什么呢?

实践出真知

   希望大家都能自己去转一下试试,而不是看一下网上的答案,以为自己记住了,只有自己动手试过了,才能记得更牢固,还有一点,网上的答案有时候也不一定对,所以实践是检验真理的唯一标准嘛。

那么经过我的测试呢,大致上和网上的答案是相似的

由低到高的转型是可以转的,从低到高的顺序依次是:

byte特殊的char

好像少了点什么,没错,char没有在里面,char的转换很神奇,留言区大家也有提到,我测试的结果是:

任何的基本类型不可以通过直接赋值给char类型的方式进行转换

char a = 任意基本类型 b;

     这个语句是无法通过我们的编译的,欢迎大家把编译通过的结果放到留言区打我脸嘿嘿。

     但是当任意基本类型 a = char b时会发生什么有意思的事情呢,奇怪了,居然只有int之后的基本类型才能接受char类型,否则编译无法通过,这又是为什么呢?

   我做了一个设想,会不会有char类型的编码大于我们的int类型的存储范围,而导致转换的时候出现错误呢?结果尝试了各种中文日文韩文后发现,我并没有成功,只能借助下我们伟大的百度了。于是我再百度百科查阅到了如下编码处理

Unicode编码

  处理DBCS字串非常杂乱,但是处理Unicode文字则像处理有秩序的文字。你也许会高兴地知道前128个Unicode字元(16位元代码从0x0000到0x007F)就是ASCII字元,而接下来的128个Unicode字元(代码从0x0080到0x00FF)是ISO 8859-1对ASCII的扩展。     Unicode中不同部分的字元都同样基於现有的标准。这是为了便於转换。希腊字母表使用从0x0370到0x03FF的代码,斯拉夫语使用从0x0400到0x04FF的代码,美国使用从0x0530到0x058F的代码,希伯来语使用从0x0590到0x05FF的代码。    中国、日本和韩国的象形文字(总称为CJK)占用了从0x3000到0x9FFF的代码。——摘自百度百科

  那么就是说最大的编码代码是0x9FFF,这是一个16进制数,偷偷懒我们就不用手算了,放到咱们代码里输出看看,结果是40959,也就是char类型最大的编码到40959!

Char和int 不得不说的故事

   因此我在这里做一个大胆的猜想,为什么我们的编译器只有在大于int时才能接收我们的char类型的变量,就是我们jdk的开发人员早就意识到了这个问题,在我们的java中默认的short类型最大的表示是32767,因此如果用short类型来存储char类型的编码可能会因为超出最大范围而导致字符的损失,因此只有在int类型以上的的基本数据类型才可以接收我们char类型的变量来进行类型转换。     这里我这里还有一些关于这个问题的一些有趣的测试,有兴趣的小伙伴可以联系我,我们一起讨论,这里文章内容已经比较多了,再写下去小伙伴们要看晕了,在此就不再赘述相关内容。

2.答案

不可以,理由见上方分析。