Day04类型转换

类型转换

注意点:
1.不能对布尔值进行转换
2.不能把对象类型转换为不相干的类型
3.在把高容量转换到低容量的时候,强制转换
4.转换的时候可能存在内存溢出,或者精度问题!

高转低,强制转换;低转高,自动转换

低------------------------------------------->高 
byte,short,char-> int -> long-> float -> double 

int i=128;
 byte b=(byte)i;    //内存溢出
 //强制转换   (变量名)变量类型   从高到低
 //自动转换   从低到高
        System.out.println(i);//128
        System.out.println(b);//-128


//精度
System.out.println((int)23.7f);//23
        System.out.println((int)24.6);//24


int  a=10_0000_0000;
        int b=20;
        System.out.println(a*b);//-1474836480, 计算的时候溢出了
        System.out.println((long)(a*b));//-1474836480   a*b计算的时候已经出错了
        System.out.println(((long)(a))*b);//20000000000    先把一个数转换为long
                           
                           
                           
                           
                           
                           
                           
                           
                   
//在Java中,当一个long类型的数和一个int类型的数相乘时,结果通常会是long类型。Java在执行算术运算时,会根据操作数的类型选择适当的数据类型来存储结果。在这种情况下,由于long类型的数值范围比int类型更大,所以结果会被存储为long类型。


练习题

  1. byte b = 127; byte c = (byte)(b + 1);,执行后 c 的值为______,原因是______。
  • 答案:- 128,原因:byte 类型的取值范围是 -128127127 + 1 超出了这个范围,产生溢出,结果为 -128
  • 首先明确byte类型的取值范围
    • byte类型在Java中是8位有符号整数类型,它的取值范围是- 128127。即最小值是- 128(二进制表示为10000000),最大值是127(二进制表示为01111111)。
  • 然后看表达式byte c=(byte)(b + 1)
    • b = 127时,b的二进制表示为01111111
    • 当执行b+1操作时,在计算机中,这是按照整数运算规则进行的,此时01111111127)加1,得到10000000
    • 但是10000000如果按照有符号整数来解释(因为byte是有符号类型),它在byte类型的取值范围内对应的十进制值是- 128
    • 然后再通过(byte)进行强制类型转换,由于计算结果10000000已经超出了byte类型0 - 127的正数范围,在byte类型中就被解释为- 128

所以byte c=(byte)(b + 1)执行后,c的值为- 128

拓展:有符号整数

  1. 有符号整数的概念
    • 在计算机中,整数可以分为有符号整数和无符号整数。有符号整数用于表示正数、负数和零,而无符号整数只能表示零和正数。
    • 对于有符号整数,最常见的表示方法是使用二进制补码(two's complement)。在这种表示方法中,最高位(最左边的位)被用作符号位。如果符号位是0,表示这个数是正数;如果符号位是1,表示这个数是负数。
  2. byte类型与二进制补码
    • byte类型在Java中是8位的有符号整数类型。它的取值范围是从 - 128到127。
    • 当我们用二进制补码来表示byte类型的数时:
      • 正数的二进制补码就是其本身的二进制表示。例如,127的二进制表示是01111111
      • 负数的二进制补码是通过对其绝对值的二进制表示取反再加1得到的。
    • 对于10000000这个二进制数:
      • 在8位有符号整数(byte类型)的二进制补码表示中,10000000被解释为- 128
      • 我们可以这样理解:
        • 根据二进制补码的规则,对于负数,要得到其对应的十进制值,先对除符号位外的其他位取反,然后加1,再加上负号。
        • 对于10000000,除符号位外的其他位都是0,取反后还是0,加1后得到10000000,对应的十进制值就是- 128

b = 127(二进制01111111),执行b+1得到10000000,在byte类型(有符号8位整数)中,10000000就表示- 128

posted @ 2023-12-21 15:39  1hahahahahahahaha  阅读(19)  评论(0)    收藏  举报