说明
当把整数赋值给一个byte、short、int、long型变量时,不可以超出这些变量的取值范围,否则必须进行强制类型转换。例如:
public class Examples {
public static void main(String[] args) {
byte b = (byte)129;
System.out.println(b);
}
}
输出结果
-127
解释
预备知识
- 原码:原码(true form)是一种计算机中对数字的二进制定点表示方法。原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小。
- 反码:反码是数值存储的一种,多应用于系统环境设置,如linux平台的目录和文件的默认权限的设置umask,就是使用反码原理。
反码跟原码是正数时,一样;负数时,反码就是原码符号位除外,其他位按位取反。 - 补码:在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。
正整数的补码是其二进制表示,与原码相同;求负整数的补码,将其原码除符号位外的所有位取反(0变1,1变0,符号位为1不变)后加1。
分析
129 int类型(4个字节)二进制为:00000000 00000000 00000000 10000001
存储用补码。正数的补码与其原码相同:00000000 00000000 00000000 10000001
int转byte(1个字节),截取:10000001
补码转反码:符号位为1,为负数,负数由补码得到反码是补码末位-1:10000000
反码转原码:逐位取反,符号位除外:11111111
原码转二进制:符号位提取,替换为0:-01111111
二进制转十进制:-2^7 -1 = -127