Java中int和long数据类型转换及溢出问题
基本数据类型转换及溢出问题
1. int(Integer)和long(Long)之间的转换
- int转long:向上转换,可直接进行隐形转换
int a = 10;
long b = (int)a;
int a = 10;
long b = a.longValue();
- long转int:向下转换(容量大的数据类型转为容量小),可能会出现数据溢出情况
long a = 10;
int b = (int)a;
long a = 10;
int b=a.intValue();
2.基本数据类型的取值范围
数据类型 | 占位大小 | 存储数据量 | 最大值 | 最小值 |
---|---|---|---|---|
byte | 8 | 2^8-1 = 255 | 2^7-1 = 127 (0111,1111) | -2^7 = -128 |
short | 16 | 2^16-1 = 65535 | 2^15-1 = 32767 | -2^15 = -32768 |
int | 32 | 2^32-1 | 2^31-1 = 2147483647 | -2^31 |
long | 64 | 2^64-1 | 2^63-1 | -2^63 |
byte类型的最小值为什么是-128而非-127?
原因:计算机表示数值的方法有:原码、反码、补码,而现在计算机用补码存储整数数值
- 原码:用二进制表示的原始编码
- 反码:除了符号位外,其它位取反
- 补码:正数的补码等于原码、负数的补码等于反码加1
而byte的最大正数为二进制的01111111 = 2^7-1 = 127 (0为符号位),这没有问题
对于负数而言,补码等于反码加1
- 1111,1111 补码就是 1000,0001 = -1
- 1111,1110的补码就是 1000,0010 = -2
- 依次类推…
- 1000,0001的补码就是 1111,1111 = -127
- 接下去 最大负数为 1000,0000 (十进制为 -0,但是就与+0重复,没有意义)不是负数的话,补码仍为 1000,0000,计算机就将这一数值表示为最大负数 -128
3.几个Demo
public class demo1{public static void main(String[]args){byte num=127;num+=2;
//输出是-127,原理是因为byte类型是8位的数据System.out.println(num);}
}
分析:127 对应的二进制为 0111,1111,其补码仍为:0111,1111,(计算机中只有加法运算,且运算都是其补码运算!!!)
加上2之后-------> 补码是:1000,0001(加1为“1000,0000”再加1为“1000,0001”)
上述补码再转回原码为:1111,1111 就是 -127
注意:当数据类型为byte、short、char型时,相互之间不能转换,它们参与运算是先将数据转换为int类型进行运算,也就是说若demo中num为byte类型的数据的话,是不会出现错误情况的!
public class demo1{public static void main(String[]args){Int num1=2147483647;Int num2=2147483647;//输出是-2,原因是int容器太小,溢出System.out.println(num1+num2);}
}
分析:本来结果是 4294967294,因为int 之间的结果 还是int类型
4294967294的二进制及其补码都是 “1111,1111,1111,1111,1111,1111,1111,1110”转换为补码就是“1000,0000,0000,0000,0000,0000,0000,0010”
十进制结果就是 -2
4.int转为byte类型的溢出处理
byte的存储范围是-128-127的整数范围,byte a = (byte)130;结果会是多少呢?java是如何处理强制类型转换的溢出处理呢?
- 在计算机中,所有数据都以补码形式存储,那么130首先当作int存储,32位,其二进制原码和补码都为:“0000,0000,0000,0000,0000,0000,1000,0010”;
- 转换为byte类型,进行截取,高字节部分去除,保留低字节部分(即留取后面部分),得到转换为byte的补码为:“1000,0010”
- 转回原码为:“1000,0010”—>“1000,0001”------>“1111,1110” 十进制表示“-126”
所以高容量向下转换存在数据溢出的情况
以上只举例说明了几种基础数据类型间的转换,其它类型同理~
Java中int和long数据类型转换及溢出问题相关推荐
- JAVA中int、String的类型转换(亲测)
int -> String int i=12345; String s=""; 第一种方法:s=i+""; 第二种方法:s=String.valueOf( ...
- JAVA中int、String的类型转换
int -> String int i=12345; String s=""; 第一种方法:s=i+""; 第二种方法:s=String.valueOf( ...
- java中int与char之间的互相转化
引言 在介绍java中int与char之间的互相转化之前,让我们先简单的回顾一些会涉及到的知识. 数据类型 在介绍int与char的转换之前,我们先来回顾一下java中的基本数据类型: 类型 大小 包 ...
- PG中的几种数据类型转换方式
PG中的几种数据类型转换方式 1.通过格式化函数进行转换 函数 返回类型 描述 示例 to_char(timestamp,text) text 把时间戳转换成字符串 to_char(current_t ...
- java double 类型_关于Java中的double类型数据
在初学Java的时候,一般我们都会从基本的数据类型开始学习,而在基本数据类型中,我认为double类型是比较难理解的,并且在以后的学习或工作中,在double类型数据这遇到的坑也是极多的.例如下面的这 ...
- 通读《C++ primer plus》— C++中的5种数据类型转换方式
通读<C++ primer plus>-记录一 C++中的5种数据类型转换方式 1.始化和赋值时转换 比如 int a=1; long b=2147483647; a=b; 上面的代码并不 ...
- 你知道如何快捷地在Java中使用现有Excel数据创建PPT图表吗?
Spire.Office for .NET是一套企业级的涵盖 E-iceblue 所有 .NET Office 组件的集合.使用 Spire.Office for .NET,开发人员可以创建大量的用于 ...
- 016 Java中 int、Integer和 new Integer() 使用==比较
Java中 int.Integer和 new Integer() 使用==比较 int则是java的一种基本数据类型,其定义的是基本数据类型变量 :Integer是int的包装类,其定义的是引用类型变 ...
- 【java技术面试第四讲】Java面试题04.java中int占几个字节
Java面试题04 : java中int占几个字节 好啦!今天的文章就给看官们分享到这儿 如果觉得有帮助,记得关注.转发.收藏哟~ 最近小编准备以连载的形式为大家分享一系列完整的面试经常问 ...
最新文章
- G1回收器:我怎么知道你是什么时候的垃圾?
- 英雄联盟手游火线妹上线了!金克丝也想成为第一AD吗?
- ubuntu复制文件到另一个文件夹_简单介绍一下电脑中的文件或文件夹的复制、移动及删除的操作方式...
- 从“做什么”到“怎么做”,说说一只蚊子
- if--(else)语句,getchar()和putchar()、、||、!逻辑运算符
- Chapter 4 Invitations——10
- matlab18a安装步骤,MATLAB R2018a图文安装教程
- 《看见》读后感:跟柴静一起成长,追求独立与真相
- mfs java_mfs权威指南
- 白盒测试和黑盒测试(感谢东子哥作答)
- 计算机硬件综合实验六:CPU组成与机器指令执行实验
- Matlab图形窗口大小的控制 ,plot窗口大小,figure大小,axis设置,实用
- markdown 做图 : Mermaid语法
- idea社区版配置jsp
- 二维码怎么制作?看完这篇你就会了
- 快手__nsTokensig和sig签名
- 一个新开源的BUG管理系统Cynthia
- android定位的速度方向如图所示,在Android中计算罗盘方位/前往位置
- matlab制作动画并保存,[转载]Matlab中动画的实现、制作和保存(转载Matlab技术论坛)...
- 2021-2027全球与中国变性酒精市场现状及未来发展趋势