JAVA中整数类型数据溢出问题研究
Java中的数值类型都是有符号类型,最高位表示符号位。这里我们以byte类型为例,探讨整型的数据溢出问题。
基本数据类型 对应的包装类 所占bit位 取值范围
byte Byte 8 -2^7 ~ 2^7-1
short Short 16 -2^15 ~ 2^15-1
int Integer 32 -2^31 ~ 2^31-1
long Long 64 -2^63 ~ 2^63-1
为啥取值范围是这样呢?下面我们慢慢来看下。
package com.lcx.datatype;
/*** * @author**/
public class ByteTest {public static void main(String[] args) {bypeM();}public static void bypeM(){/*** Java中的数值类型都是有符号类型,最高位表示符号位。* 这里我们以byte类型为例,探讨数据溢出问题* byte类型 占一个字节8个bit位,所以能表示的数值形式(注意不是数值范围,因为第一位是符号位)是 0 000 0000 ~ 1 111 1111 也就是可以表示2^8-1+1 = 256个数字* 由于第一位是符号位,那么 * 正数的范围是 0 000 0000 ~ 0 111 1111 --> 0 ~ 127* 负数的范围是 1 000 0000 ~ 1 111 1111 -->-128~-1* 总的范围是 1 000 0000 ~ 0 111 1111 -->-128 ~ 127(-2^7 ~ 2^7-1)* 同理 short、int、long 都是这样* 计算机中,负数使用补码形式表示,正数的原码、反码、补码都相同,负数的反码是符号位1除外其余取反,负数的补码 = 反码+1* 1 000 0001 -1的原码* 1 111 1110 -1的反码* 1 111 1111 -1的补码* 通过这种方式 我们可以反推 1 111 1111 表示 -1* 这里的-128的补码形式有点特殊,可以理解为数值包含符号位了,不知道下面这种解释对不对。* 1 1000 0000 -128的原码* 1 0111 1111 -128的反码* 1 1000 0000 -128的补码* 由于byte只能有8bit位,现在占9bit位, 多的那一位移除掉保留后面8位,-128的补码 为 1000 0000* * 模拟数据溢出* Byte.MAX_VALUE = 0 111 1111 = 127,Byte.MAX_VALUE+1 = 1 000 0000 = -128,Byte.MAX_VALUE+2 = 1 000 0001(-->反码1 000 0000-->原码1 111 1111) = -127* Byte.MIN_VALUE = 1 000 0000 =-128,Byte.MIN_VALUE-1 = 0 111 1111 = 127,Byte.MIN_VALUE-2 = 0 111 1110 = 126*/Byte b_max_plus_1 = (byte) (Byte.MAX_VALUE + 1);//最大值+1 数据溢出到最小值Byte b_max_plus_2 = (byte) (Byte.MAX_VALUE + 2);Byte b_min_minus_1 = (byte) (Byte.MIN_VALUE - 1);//最小值-1 数据溢出到最大值Byte b_min_minus_2 = (byte) (Byte.MIN_VALUE - 2);System.out.println("Byte.BYTES="+Byte.BYTES);System.out.println("Byte.MAX_VALUE="+Byte.MAX_VALUE);System.out.println("Byte.MIN_VALUE="+Byte.MIN_VALUE);System.out.println("b_max_plus_1="+b_max_plus_1+","+"b_max_plus_2="+b_max_plus_2);System.out.println("b_min_minus_1="+b_min_minus_1+","+"b_min_minus_2="+b_min_minus_2);//Byte没有打印二进制的工具函数,Integer有打印二进制的工具函数System.out.println("Byte.MAX_VALUE的二进制 = "+Integer.toBinaryString(Byte.MAX_VALUE));//前面为0的bit位没有打印System.out.println("Byte.MIN_VALUE的二进制 = "+Integer.toBinaryString(Byte.MIN_VALUE));System.out.println("Integer.MAX_VALUE的二进制 = "+Integer.toBinaryString(Integer.MAX_VALUE));//第一位 符号位0 没有打印System.out.println("Integer.MIN_VALUE的二进制 = "+Integer.toBinaryString(Integer.MIN_VALUE));}
}
测试结果
JAVA中整数类型数据溢出问题研究相关推荐
- java中map转为json数据_Java技术-将java中Map类型数据转化为json数据并以Ajax形式返回...
Java技术-将java中Map类型数据转化为json数据并以Ajax形式返回html 1.自定义工具类(简单易用)-下面是我写的一个简单的工具类前端 package com.test.util; i ...
- java short long_谈谈Java中整数类型(short int long)的存储方式
在java中的整数类型有四种,分别是 byte short int long 其中byte只有一个字节 0或1,在此不详细讲解. 其他的三种类型如下: 1. 基本类型:short 二进制位数:16 ...
- java中BigDecimal类型数据大小比较
一 概述 在Java中会存在数值的比较,在进行金额计算的时候,一般会通过BigDecimal类型的数字进行计算. 二 BigDecimal类型数据大小比较 if(numOne.compareTo(nu ...
- Java中Byte类型数据在运算中的问题
比如: byte a=1; byte b=2; byte c; c=a+b; //这样是计算不出c,是错误的 c=a+1; //这样也是不能计算c的 c=64+1; //为什么这样就能计算c,在Jav ...
- Java中Map类型数据使用LinkedHashMap保留数据的插入顺序
场景 Vue中JS遍历后台JAVA返回的Map数据,构造对象数组数据格式: Vue中JS遍历后台JAVA返回的Map数据,构造对象数组数据格式_BADAO_LIUMANG_QIZHI的博客-CSDN博 ...
- Java中double类型比较大小或相等的方法
在Java中int类型数据的大小比较可以使用双等号,double类型则不能使用双等号来比较大小,如果使用的话得到的结果将永远是不相等,即使两者的精度是相同的也不可以.下面介绍两种比较double数据是 ...
- Java中double类型大小比较的五种方法
文章目录 1.使用BigDecimal 2.使用包装类Double 3.在误差范围内运行相等 4.转换成字符串 5.使用doubleToLongBits()方法 在Java中 int类型数据的大小比较 ...
- Java中在时间戳计算的过程中遇到的数据溢出问题
背景 今天在跑定时任务的过程中,发现有一个任务在设置数据的查询时间范围异常,出现了开始时间戳比结束时间戳大的奇怪现象,计算时间戳的代码大致如下. package com.lingyejun.authe ...
- java 时间戳最大值_Java中在时间戳计算的过程中遇到的数据溢出问题解决
背景 今天在跑定时任务的过程中,发现有一个任务在设置数据的查询时间范围异常,出现了开始时间戳比结束时间戳大的奇怪现象,计算时间戳的代码大致如下. package com.lingyejun.authe ...
最新文章
- 谷歌地图API位置请求_Google Maps API
- 卷积层数据放大_卷积神经网络重要回顾
- MaxCompute Next
- 快速学习R语言的经验分享
- 【剑指offer】旋转数组的最小数字
- LIRe提供的图像检索算法的速度
- bzoj1076 奖励关(概率dp)(状态压缩)
- [人工智能]深入浅出机器学习
- 天刀各大服务器位置,天涯明月刀ol第十次合区详解 天刀ol第十次合区结果一览...
- 微信自定义菜单以及自动回复
- 转:稻盛和夫:幸福的那些“法”,背后承载的“道”是什么?
- 老人腰腿痛怎么办 传授给你五个小妙招
- 非科班出身程序员该如何弥补技术差距?
- 第一章	计算机系统基础知识(1)
- oracle行转列处理方法,oracle行转列解决办法
- MicroServices(5)---DevOps用户手册
- 压缩图片(java)
- 首单怎么让用户掏钱,只能降价吗?|用户心理学
- 2023年全国最新会计专业技术资格精选真题及答案20
- 【Ansys Workbench】—优化设计简介
热门文章
- python最简单的账号密码验证_Python之简单的用户名密码验证
- 项目管理中网络图的看法和相关参数阅读说明
- mysql uncompress_如何在php中实现mysql compress()函数
- input输入框禁止自动补全和下拉提示
- 参考平面及其高度_柱面及其方程
- Python笔记-UiSelector文本定位方式(3种定位并点击)
- Java动态加载类(对反射的基本理解)
- Python实现HTTP服务器(三)线程、进程、协程实现多任务
- 前后端分离html ssm,前后端分离请求ssm返回数据
- pc显示器分辨率 前端_2020电竞显示器推荐