计算机整数表示有两种方式:无符号编码和有符号编码
无符号编码只能表示非负数,且Java语言不支持无符号编码
补码编码既能表示非负数又能表示负数,是机器默认的编码方式
也就是说,补码用来表示带符号的整数
n位二进制数可表示2^n个数
真值的取值范围:-2^(n-1)~2^(n-1)-1
为了表示符号,有符号编码将补码的最高位设为符号位,符号位为0表示正数,符号位为1表示负数
补码求真值
若补码开头为0,说明是正数,补码就是二进制数
若补码开头为1,说明是负数,开头加上负号,整体取反再加一
例如1110->-0010,真值为-2
真值求补码
若真值为正,那么补码就是真值的二进制表达
若真值为负,那么补码就是真值的二进制表达,去掉符号,整体取反再加一
例如-0101(-5)->1011,补码为1011
负整数的二进制表达转换成补码
一般思路是负整数转换为二进制数再转换为补码,这里提供了一种直接转换的方式
把负号变为1,对数字部分进行取反直到最后一个1(保留最后一个1),1后面的数不取反照抄
例如-3的二进制表达是-011->1101
补码转换成负整数的二进制表达
与上面操作类似
在补码前加负号,对数字部分进行取反直到最后一个1不再取反,1后面的数直接写下
例如-3的补码为1101->-0011
上面的两种转换本质上是一样的,只是求的方法不一样,都可以使用
有符号数转换成无符号数
若有符号数大于等于0则不需要转换
若有符号数为负数,则无符号数等于有符号数+2^n(n为位数)
无符号数转换成有符号数
无符号数若小于2^(n-1,n为位数)则不需要转换
无符号数大于等于2^(n-1),则有符合数等于无符号数-2^(n-1)
有符号数和无符合数的范围
n个二进制位数时,都表示有2^n个数
有符号数:-2^(n-1)~2^(n-1)-1
无符号数:0~2^(n-1)-1