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中整数类型数据溢出问题研究相关推荐

  1. java中map转为json数据_Java技术-将java中Map类型数据转化为json数据并以Ajax形式返回...

    Java技术-将java中Map类型数据转化为json数据并以Ajax形式返回html 1.自定义工具类(简单易用)-下面是我写的一个简单的工具类前端 package com.test.util; i ...

  2. java short long_谈谈Java中整数类型(short int long)的存储方式

    在java中的整数类型有四种,分别是 byte  short int long 其中byte只有一个字节 0或1,在此不详细讲解. 其他的三种类型如下: 1. 基本类型:short 二进制位数:16 ...

  3. java中BigDecimal类型数据大小比较

    一 概述 在Java中会存在数值的比较,在进行金额计算的时候,一般会通过BigDecimal类型的数字进行计算. 二 BigDecimal类型数据大小比较 if(numOne.compareTo(nu ...

  4. Java中Byte类型数据在运算中的问题

    比如: byte a=1; byte b=2; byte c; c=a+b; //这样是计算不出c,是错误的 c=a+1; //这样也是不能计算c的 c=64+1; //为什么这样就能计算c,在Jav ...

  5. Java中Map类型数据使用LinkedHashMap保留数据的插入顺序

    场景 Vue中JS遍历后台JAVA返回的Map数据,构造对象数组数据格式: Vue中JS遍历后台JAVA返回的Map数据,构造对象数组数据格式_BADAO_LIUMANG_QIZHI的博客-CSDN博 ...

  6. Java中double类型比较大小或相等的方法

    在Java中int类型数据的大小比较可以使用双等号,double类型则不能使用双等号来比较大小,如果使用的话得到的结果将永远是不相等,即使两者的精度是相同的也不可以.下面介绍两种比较double数据是 ...

  7. Java中double类型大小比较的五种方法

    文章目录 1.使用BigDecimal 2.使用包装类Double 3.在误差范围内运行相等 4.转换成字符串 5.使用doubleToLongBits()方法 在Java中 int类型数据的大小比较 ...

  8. Java中在时间戳计算的过程中遇到的数据溢出问题

    背景 今天在跑定时任务的过程中,发现有一个任务在设置数据的查询时间范围异常,出现了开始时间戳比结束时间戳大的奇怪现象,计算时间戳的代码大致如下. package com.lingyejun.authe ...

  9. java 时间戳最大值_Java中在时间戳计算的过程中遇到的数据溢出问题解决

    背景 今天在跑定时任务的过程中,发现有一个任务在设置数据的查询时间范围异常,出现了开始时间戳比结束时间戳大的奇怪现象,计算时间戳的代码大致如下. package com.lingyejun.authe ...

最新文章

  1. 谷歌地图API位置请求_Google Maps API
  2. 卷积层数据放大_卷积神经网络重要回顾
  3. MaxCompute Next
  4. 快速学习R语言的经验分享
  5. 【剑指offer】旋转数组的最小数字
  6. LIRe提供的图像检索算法的速度
  7. bzoj1076 奖励关(概率dp)(状态压缩)
  8. [人工智能]深入浅出机器学习
  9. 天刀各大服务器位置,天涯明月刀ol第十次合区详解 天刀ol第十次合区结果一览...
  10. 微信自定义菜单以及自动回复
  11. 转:稻盛和夫:幸福的那些“法”,背后承载的“道”是什么?
  12. 老人腰腿痛怎么办 传授给你五个小妙招
  13. 非科班出身程序员该如何弥补技术差距?
  14. 第一章 计算机系统基础知识(1)
  15. oracle行转列处理方法,oracle行转列解决办法
  16. MicroServices(5)---DevOps用户手册
  17. 压缩图片(java)
  18. 首单怎么让用户掏钱,只能降价吗?|用户心理学
  19. 2023年全国最新会计专业技术资格精选真题及答案20
  20. 【Ansys Workbench】—优化设计简介

热门文章

  1. python最简单的账号密码验证_Python之简单的用户名密码验证
  2. 项目管理中网络图的看法和相关参数阅读说明
  3. mysql uncompress_如何在php中实现mysql compress()函数
  4. input输入框禁止自动补全和下拉提示
  5. 参考平面及其高度_柱面及其方程
  6. Python笔记-UiSelector文本定位方式(3种定位并点击)
  7. Java动态加载类(对反射的基本理解)
  8. Python实现HTTP服务器(三)线程、进程、协程实现多任务
  9. 前后端分离html ssm,前后端分离请求ssm返回数据
  10. pc显示器分辨率 前端_2020电竞显示器推荐