java中int类型取值范围问题

java中int的类型占4个字节,与操作系统无关,要弄明白int的取值范围问题.
首先,我们来看一下byte的取值范围
byte 大小一个字节.
如:1111 1111 为一个字节
但是整型是分正负的 ,所以在计算机中我们用最高位来表示符号位,0表示正数,1表示负数
byte类型中最大的数 : 0111 1111 表示27−1=1272^7-1=12727−1=127
那么最小的数应该是1111 1111,表示-127了,所以范围应该是-127~127了,但是这和我们常见的byte的取值范围是-128~127并不符合.
这里有一个问题,就是关于0的表示,0的表示有+0和-0之分,但是我们只需要一个来表示0

所以我们就采用+0来表示0.
为了不浪费-0这个数值,我们就将-0来表示-128.
所以取值范围就有了-128~127

看到这里,很多人还是不明白,那我们来看一下-128的二进制表示:

-0的补码对应了-128的补码的后面8位,但是这并不是-128的真正补码,真正的补码已经溢出了.

关于数值溢出问题.

首先我们看下面一段程序.

public class Test {public static void main(String[] args) {byte a=127;byte b = (byte)(a + 1);System.out.println(b);}
}

运行结果

127+1
变为了-128,我们来看一下计算机底层都做了什么?
127 的原码:0111 1111加1后为1000 0000,(在计算机中都是补码,有人可能有疑问,为什么127是原码,加1后变为了补码,因为正数的原码和补码是相同的,所以得到的结果就是补码)而补码表示的是128

有人可能疑惑1000 0000 中的1不是符号位吗,为什么能参与运算,事实是:补码是没有符号位的,因为补码就是负数转换为了正数,既然是正数,肯定不需要符号位了.

同理,我们可以退广到int
int的取值范围是−231-2^{31}−231~231^{31}31-1,即用-0表示最小的数

public class Test {public static void main(String[] args) {System.out.println(Integer.MIN_VALUE);//-2147483648=-2^31}
}

因为-0多表示了一位.和byte中的-128类似


我们可以将数据看成是一个循环圆,这样无论数据如何转换,都将在这个圆内.

public class Test {public static void main(String[] args) {//当值大于127时上界溢出,对256取余,剩下的数字就相当于向右走了多少个int a = 128;byte b = (byte) a;System.out.println(b);//-128//当值小于-128时下界溢出,对256取余,剩下的数字就相当于向左走了多少个int c =-378;byte d =(byte)c;System.out.println(d);//-122}
}

总结:128%256=128,相当于从0向右走了128,所以输出-128,
378%256=122,想当于从0想左走了122,所以输出-122

关于java中int类型的取值范围等问题相关推荐

  1. 为何 java 中 int 类型的取值范围是 [-2147483648, 2147483647]

    在 jdk 源代码时, 在 Integer 包装类中,可以看到定义了两个静态变量 /*** A constant holding the minimum value an {@code int} ca ...

  2. Java基础题37:(单选题)java中char类型的取值范围是() A.0 ... 32767 B.0 ... 65535

    37.(单选题)java中char类型的取值范围是() A.0 - 32767 B.0 - 65535 C.–256 - 255 D.–32768 - 32767 [正确答案]B [答案解析]在jav ...

  3. 为什么Java中float类型的取值范围大于long类型

    在学习Java的过程中,我遇到了一个很有意思的问题,就是为什么Java中float类型的取值范围会大于long类型. 类型名 大小/字节 取值范围 float 4(32bit) -3.4E+38 ~ ...

  4. java byte 正数最大_关于JAVA中Byte类型的取值范围的推论(*零为正数,-128在计算机中的表示方法...)...

    先看一段推理 +124:0111 1100 -124:1000 0100 +125:0111 1101 -125:1000 0011 +126:0111 1110 -126:1000 0010 +12 ...

  5. Java中byte类型的取值范围

    取值范围为-128~127 1.为什么是[-128,127]   计算机中存储最大的应该是0111 1111,第一位是符号位,所以表示最大的数值:127   存储的1 1111111应该是最小的数值: ...

  6. int 类型的取值范围

    大伙都知道int类型的 取值范围是 -2147483648 到 2147483647         那为什么不是                              -2147483647 到 ...

  7. C语言中不同类型的取值范围

    C语言中的不同类型的取值范围 前言 C语言中,我们知道最基本的数据类型有int整型,float和double浮点型,char字符型,在计算机里,他们的取值并不是任意和无限的,都有相应的取值范围,那么计 ...

  8. python中long类型的取值范围_java基本数据类型取值范围

    在JAVA中一共有八种基本数据类型,他们分别是:byte.short.int.long.float.double.char.boolean 整型 其中byte.short.int.long都是表示整数 ...

  9. 为什么Int类型的取值范围是2的31次方减1

    今天面试中被问到这个问题,之后认认真真的想了这个问题,因此记录一下.嘘嘘,莫笑. 数据在计算机里面以2进制存储.正整数就是以二进制存储.负整数以补码存储.一个Int类型数据占据空间4字节.每个字节8位 ...

最新文章

  1. sql server 查看对象最后修改时间
  2. c语言图形界面设定,「分享」C语言如何编写图形界面
  3. Nature最新封面:哺乳动物有「一键返老还童」按钮,复旦校友的这项研究恢复了老年小鼠视力...
  4. python爬虫软件-Python爬虫工具篇 - 必会用的6款Chrome插件
  5. ABAP 在字符串之间加入若干空格
  6. pip安装 mysql 客户端_pip安装mysql-python模块报错:cannot find -lmysqlclient_r
  7. Layui 数据表格动态cols(字段)动态变化
  8. linux exosip编译,eXosip2 osip 编译安装
  9. 专利申请过程中的重要文件总结
  10. vue中打印多一页空白页
  11. 包饺子、看表演、逛庙会 中外居民北京“过大年”
  12. shell脚本使用两个横杠接收外部参数
  13. wegame导致win10无限重启问题解决
  14. 项目管理计算:EV、PV、AC、BAC、CV、SV、EAC、ETC、CPI、SPI各是什么意思
  15. 卡巴斯基分析报告:宠物追踪器面临的潜在风险
  16. oracle11g断电后无法启动,电脑突然断电后无法启动
  17. PHP在大型网站开发
  18. 238. 银河英雄传说
  19. MySQL集群解决方案(1):MySQL数据库的集群方案
  20. MongoDB文档数据库

热门文章

  1. 2023计算机毕业设计-个人博客文章管理系统springboot-JAVA.VUE(论文+开题报告+运行)
  2. java holder 遍历_如何获取所有RecyclerView ViewHolder?
  3. IIS发布.NET Core项目出现HTTP错误500.19 - Internal Server Error[错误代码:0x8007000d]
  4. 基于php装修公司网站设计
  5. Android 平台通讯架构研究
  6. android这个软件在哪里设置,怎么设置安卓手机软件的默认安装位置
  7. JavaWeb——HTML基本标签(1)作业
  8. acm c++ 练习中出现的错误类型
  9. .net ajax 服务器,以服务器端为中心的 ASP.NET AJAX 模式(2)-陈广琛 | Microsoft Docs
  10. 青岛计算机操作员初级考试时间,青岛市2021年初级会计考试时间安排在这里!...