java当数值超过byte时_【Java学习重难点记录】byte数据类型在显式类型转换时超出其取值范围的转换过程...
写在前面本文章转载于我的个人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/BYTE数据类型简介byte是四个整.
写在前面
本文章转载于我的个人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/
BYTE数据类型简介
byte是四个整数类型(byte、short、int、long)中取值范围最小的整型数据类型,具体如下:
数据类型转换
数据类型转换分为隐式转换和显式转换(也称强制类型转换)
隐式转换指的是低精度数据类型向高精度数据类型转换,数据不会溢出,并且一定成功,如下:
输出结果为:
显式转换(也称强制类型转换) 指的是高精度数据类型转换向低精度数据类型,转换时可能会造成数据精度损失,如下:
输出结果为:
BYTE类型显式转换时超出其取值范围
若我们运行以下代码:
输出结果为:
因为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。
写在最后
在研究过程中发现,其实源码、反码、补码中可以深挖的东西还有好多,都十分有趣,之后也会记录。
最后,希望大家一起交流,分享,指出问题,谢谢!
本文章转载于我的个人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/
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)