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.基本数据类型的取值范围

数据类型占位大小存储数据量最大值最小值
byte82^8-1 = 2552^7-1 = 127 (0111,1111)-2^7 = -128
short162^16-1 = 655352^15-1 = 32767-2^15 = -32768
int322^32-12^31-1 = 2147483647-2^31
long642^64-12^63-1-2^63

byte类型的最小值为什么是-128而非-127?
原因:计算机表示数值的方法有:原码、反码、补码,而现在计算机用补码存储整数数值

  • 原码:用二进制表示的原始编码
  • 反码:除了符号位外,其它位取反
  • 补码:正数的补码等于原码、负数的补码等于反码加1

而byte的最大正数为二进制的01111111 = 2^7-1 = 127 (0为符号位),这没有问题
对于负数而言,补码等于反码加1

  1. 1111,1111 补码就是 1000,0001 = -1
  2. 1111,1110的补码就是 1000,0010 = -2
  3. 依次类推…
  4. 1000,0001的补码就是 1111,1111 = -127
  5. 接下去 最大负数为 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是如何处理强制类型转换的溢出处理呢?

  1. 在计算机中,所有数据都以补码形式存储,那么130首先当作int存储,32位,其二进制原码和补码都为:“0000,0000,0000,0000,0000,0000,1000,0010”;
  2. 转换为byte类型,进行截取,高字节部分去除,保留低字节部分(即留取后面部分),得到转换为byte的补码为:“1000,0010”
  3. 转回原码为:“1000,0010”—>“1000,0001”------>“1111,1110” 十进制表示“-126”

所以高容量向下转换存在数据溢出的情况

以上只举例说明了几种基础数据类型间的转换,其它类型同理~

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Javalong类型可以和int类型进行计算。long类型可以存储更大范围的整数值,占据8个字节(64位),而int类型只能存储较小范围的整数值,占据4个字节(32位)。当我们对long类型int类型进行计算时,Java会自动将int类型的值转换long类型,然后进行计算。 例如,我们可以将一个int类型的变量和一个long类型的变量相加,结果将会是一个long类型的值。代码示例如下: ```java int a = 10; long b = 20; long result = a + b; // 将int类型的值a转换long类型,然后与b相加 System.out.println(result); // 输出结果为30 ``` 同样,我们也可以进行其他的数学运算,如减法、乘法和除法。Java会根据需要自动进行类型转换,确保计算结果的准确性。 需要注意的是,当long类型的值超出int类型的范围时,可能会导致溢出错误。因此,在进行计算时,我们需要确保结果可以被int类型接受,或者使用更为安全的long类型存储计算结果。 综上所述,long类型int类型可以进行计算,Java会自动进行类型转换以确保计算的准确性。 ### 回答2: Java数据类型有很多种,其包括整数类型int和浮点数类型float。而"javalong"并不是Java的内置数据类型,我理解为这是指Java的长整型数据类型long。 长整型数据类型long用于存储较大范围的整数值,它占据8个字节的存储空间(64位),可以表示范围在-9223372036854775808到9223372036854775807之间的整数。 在Javalong类型int类型之间可以进行计算。当将long类型int类型进行计算时,int类型的值会被自动转换long类型的值,然后进行计算。由于long类型的范围比int类型的范围大,所以计算结果可以正常得到。 例如,考虑以下的Java代码: ```java long a = 10000000000L; // 定义一个长整型变量a int b = 100; // 定义一个整型变量b long c = a + b; // 将a和b相加,并将结果赋给长整型变量c System.out.println(c); // 输出c的值 ``` 在这个例子,我们定义了一个long类型的变量a,并赋值为10000000000L。我们还定义了一个int类型的变量b,并赋值为100。然后,我们将a和b相加,并将结果赋给long类型的变量c。最后,我们使用System.out.println()方法打印了变量c的值。 运行以上代码,我们会得到输出结果为 "10000000100",即长整型和整型的计算结果。 所以,长整型数据类型long和整型数据类型int之间可以进行计算,并且计算结果可以正常得到。 ### 回答3: JavaJavalong类型可以和int类型进行计算。 Javalong是一种表示整数的数据类型,在Java占用8个字节。而int类型是另一种表示整数的数据类型,在Java占用4个字节。 在Java,当我们用Javalong类型int类型进行计算时,会根据需要自动进行类型转换。具体来说,如果我们将一个int类型的值与Javalong类型的值进行运算,Java会将int类型的值自动转换Javalong类型,然后再进行计算。这是因为Javalong数据范围更大,可以容纳更大的整数。 例如,我们可以将一个Javalong类型的变量与一个int类型的变量相加。Java会自动将int类型转换Javalong类型,然后进行计算。结果将会是一个Javalong类型的值。 但需要注意的是,当我们将一个Javalong类型的值赋给一个int类型的变量时,由于int类型数据范围较小,可能会导致数据溢出的情况。因此,在进行这类计算时,我们需要谨慎处理,确保不会发生数据溢出的情况。 综上所述,Javalong类型可以和int类型进行计算。在这种计算过程Java会自动进行类型转换,但需要注意数据范围的差异,避免出现数据溢出的情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值