1.int 和 byte 的简介:
int :用于定义整型类型变量的标识符,4字节,占用32位,范围 -2147483648~2147483647[-2^31~2^31-1]。
byte :用于声明字节类型变量的标识符,1字节,占用8位,范围 -128~127[-2^8~2^8-1]。
2.计算机数和真值,原码、反码和补码:
机器数:一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1。
真值:真值可以理解为真正的值,一般用十进制表示,也可以用二进制表示。
原码:是一种 计算机 中对数字的 二进制 定点表示方法。 原码表示法在数值前面增加了一位符号位(即最高位为符号位): 正数 该位为0,负数该位为1。
反码:正数的原码反码是一样的,负数的反码就是符号位不变其余的各个位依次取反。
补码:正数的补码和原码是一样的,负数的补码就是在反码的基础上加一。
3.强制类型的转换:
public class Example{
public static void main(String[] args){
int a = 10;
byte b = 10;
int c = a + b;
System.out.println("c = " + c);
}
}
当c为int 类型时,该代码可以运行,并输出结果c = 20。
public class Example{
public static void main(String[] args){
int a = 10;
byte b = 10;
byte c = a + b;
System.out.println("c = " + c);
}
}
当c为byte类型时,改代码报错,无法输出结果。
出现这种错误是因为c为byte类型而a为int类型的数据,byte类型的数据只占8位,int类型却占有32位,如果将int类型的数据转换为byte类型的数据,则要将其原有的32位减少为8位,则int类型的前24位会损失,只留下后8位,因此可能会有数据精度的损失,(例如:当a的值超过128时,int形成的机器数要超过后面8位,而如果将此int类型的值转换位byte类型的值时只能取后面八位,前面24位含有数据的被舍弃,导致数据精度损失较大),使用会报错而无法输出结果。
4. a += b 和a = a + b在byte和int的问题:
public class Example {
public static void main(String[] args) {
int a = 10;
int b = 10;
int c = 10;
b = b + a;
c += a;
System.out.println("b = " + b);
System.out.println("c = " + c);
}
}
当a、b、c都为int类型的数据时,b = b + a和c += a都可以正常的运行,得出结果b = 20, c = 20。
public class Example {
public static void main(String[] args) {
byte a = 10;
byte b = 10;
b += a;
System.out.println("b = " + b);
}
}
当a、b为byte类型当数据时,b += a可以正常的运行,得出结果为b = 20。
public class Example {
public static void main(String[] args) {
byte a = 10;
byte b = 10;
byte c = 10;
b = a + b;
System.out.println("b = " + b);
}
}
当a、b为byte类型的数据时,b = b + a会报错,无法得出结果。
出现该情况的原因是因为在等号右边两个byte类型的数据相加时,java机制会先把等号右边的两个byte类型转换为两国int的类型,再进行int类型数据的运算,得到等号右边的值为int类型的值,而等号左边的仍为byte类型,在等号的赋值作用下,int类型的数据赋值给了byte类型,因此造成了可能会有数据精度损失(为什么会有损失看第3点),因此报错。