写在前面

本文章转载于我的个人blog UltraFisher,欢迎大家浏览: https://ultrafisher.github.io

原文链接:https://ultrafisher.github.io/2020/08/15/Java%E5%AD%A6%E4%B9%A0%E9%87%8D%E9%9A%BE%E7%82%B9%E8%AE%B0%E5%BD%95/a523adce009417286c0349f2fb00a754.png

BYTE数据类型简介

byte是四个整数类型(byte、short、int、long)中取值范围最小的整型数据类型,具体如下:49f2e7e09283ff3e5cbda8696c171c35.png

a739ef1ba60c42f0cacc586144e75f71.png

数据类型转换

数据类型转换分为隐式转换和显式转换(也称强制类型转换)

隐式转换指的是低精度数据类型向高精度数据类型转换,数据不会溢出,并且一定成功,如下:0e070e5890bdab05a58ae1c9cdb1275b.png

输出结果为:652f879b67b0ada2b57dd61ef0a7c783.png

显式转换(也称强制类型转换) 指的是高精度数据类型转换向低精度数据类型,转换时可能会造成数据精度损失,如下:3d296a19e94fdb9615880f5ec9448005.png

输出结果为:377e644ba9700a55b13a2eb36725b985.png

a739ef1ba60c42f0cacc586144e75f71.png

BYTE类型显式转换时超出其取值范围

若我们运行以下代码:56d2397d7b80e1e0be11a2f7a272b9f6.png

输出结果为:f3296eb7fb63185a424870c401f90de3.png

因为byte数据类型的取值范围是-128~127,以上例子中被转换的数值为129,已经超出了byte数据类型的取值范围,所以不能正常显示为129,而现实了看似奇怪的-127.

其实,-127并不是凭空出现的,而是因为byte数据类型对于超出其取值范围的强制类型转换有特殊的处理过程。

步骤为:1.保留被转换数值补码的低字节部分;

2.将保留下来的部分转换成源码。

(这里不会对源码,反码,补码等概念进行讲解,若不了解的,请自行搜索)

接下来以129为例:第一步 保留被转换数值补码的低字节部分

129的源码为 0…0 1000 0001(源)

保留其低字节部分后为:

1000 0001(源)第二步 将保留下来的部分转换成源码

因为程序是以补码处理数值的,所以上一步中的1000 0001(源)将会被看成补码1000 0001(补)

接下来将补码还原成源码:

1000 0001(补) >>> 1000 0000(反) >>> 1111 1111(源)

1111 1111(源) 即为-127(1111 1111(源) 的最高位是符号位,1表示负数,余下的 111 1111 即为十进制的127,所以1111 1111(源) 为-127)

所以以上步骤解释了byte a = (byte)129;的输出结果为-127。a739ef1ba60c42f0cacc586144e75f71.png

写在最后

在研究过程中发现,其实源码、反码、补码中可以深挖的东西还有好多,都十分有趣,之后也会记录。

最后,希望大家一起交流,分享,指出问题,谢谢!8b22ab26ef493287a87a82da4f4b89c6.png

本文章转载于我的个人blog UltraFisher,欢迎大家浏览: https://ultrafisher.github.io

原文链接:https://ultrafisher.github.io/2020/08/15/Java%E5%AD%A6%E4%B9%A0%E9%87%8D%E9%9A%BE%E7%82%B9%E8%AE%B0%E5%BD%95/

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐