计算机存储的都是二进制的补码
我之前遇到一个强制类型转换的问题
/**
* @program: JavaSE
* @description:
* @author: HuMingHao
* @create: 2021-03-25 11:06
**/
public class Demo05 {
public static void main(String[] args) {
int i = 128;
byte b = (byte)i;// 内存溢出,强制类型转换
System.out.println(i);
System.out.println(b);
}
}
为什么会出现这种问题?
- 内存溢出
- 计算时需要强制类型转换
补码的出现主要是为了解决负数的计算问题
- 原码:用最高位代表符号,其他位代表数值,正数的符号位是0,负数的符号位是1
- 反码:正数的反码和原码相同,负数的反码,符号位不变,其他位取反
- 补码:正数的补码和原码相同,负数的补码,在反码的基础上,末位加1
int(128) 原码 00000000 00000000 00000000 10000000
int(128) 反码 00000000 00000000 00000000 10000000
int (128) 补码 00000000 00000000 00000000 10000000
因为int 32位而 byte 8 位,只取后八位
byte(128)补码 10000000
byte(128)反码 01111111
byte(128)原码 10000000
-
byte为-128 从左到右第一位是符号位
-
至于为什么8位是-128~127,是由于最高一位存储符号位,所以剩下7位代表数值大小,能从0表示到127
所以能从-127表示到127,但由于+0和-0都代表0,重复了,所以,多出一个位子,放到负数,让-0代表-128。
所以byte的范围是-128~127。