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类型。
练习题
byte b = 127; byte c = (byte)(b + 1);,执行后c的值为______,原因是______。
- 答案:
- 128,原因:byte类型的取值范围是-128到127,127 + 1超出了这个范围,产生溢出,结果为-128。 - 首先明确
byte类型的取值范围byte类型在Java中是8位有符号整数类型,它的取值范围是- 128到127。即最小值是- 128(二进制表示为10000000),最大值是127(二进制表示为01111111)。
- 然后看表达式
byte c=(byte)(b + 1)- 当
b = 127时,b的二进制表示为01111111。 - 当执行
b+1操作时,在计算机中,这是按照整数运算规则进行的,此时01111111(127)加1,得到10000000。 - 但是
10000000如果按照有符号整数来解释(因为byte是有符号类型),它在byte类型的取值范围内对应的十进制值是- 128。 - 然后再通过
(byte)进行强制类型转换,由于计算结果10000000已经超出了byte类型0 - 127的正数范围,在byte类型中就被解释为- 128。
- 当
所以byte c=(byte)(b + 1)执行后,c的值为- 128。
拓展:有符号整数
- 有符号整数的概念
- 在计算机中,整数可以分为有符号整数和无符号整数。有符号整数用于表示正数、负数和零,而无符号整数只能表示零和正数。
- 对于有符号整数,最常见的表示方法是使用二进制补码(two's complement)。在这种表示方法中,最高位(最左边的位)被用作符号位。如果符号位是0,表示这个数是正数;如果符号位是1,表示这个数是负数。
byte类型与二进制补码byte类型在Java中是8位的有符号整数类型。它的取值范围是从 - 128到127。- 当我们用二进制补码来表示
byte类型的数时:- 正数的二进制补码就是其本身的二进制表示。例如,
127的二进制表示是01111111。 - 负数的二进制补码是通过对其绝对值的二进制表示取反再加1得到的。
- 正数的二进制补码就是其本身的二进制表示。例如,
- 对于
10000000这个二进制数:- 在8位有符号整数(
byte类型)的二进制补码表示中,10000000被解释为- 128。 - 我们可以这样理解:
- 根据二进制补码的规则,对于负数,要得到其对应的十进制值,先对除符号位外的其他位取反,然后加1,再加上负号。
- 对于
10000000,除符号位外的其他位都是0,取反后还是0,加1后得到10000000,对应的十进制值就是- 128。
- 在8位有符号整数(
当b = 127(二进制01111111),执行b+1得到10000000,在byte类型(有符号8位整数)中,10000000就表示- 128。

浙公网安备 33010602011771号