1、 首先要知道符号数的二进制表现形式,在计算机中有三种表示方法,正整数是使用2的原码来表示,负整数是使用2的补码来表示。
而且在二进制里面最高位是用于表示符号位的,1为负,0为正,比如byte类型用8位来表示,其中最高位用于符号位,剩下的用于表示数值!
具体的转换过程就是补码=反码+1,反码等于原码取反(符号位不变)
举个例子:
8表示成二进制的形式是:0000 1000:;
-8表现成二进制的形式是:1111 1110 ;
具体是怎样转换的呢?首先把0000 1000取反得到反码就是1111 0111,然后加1得到补码就是1111 1000;
至于为什么要使用2的补码的方式来表示负数可以参考下面的网址:
http://www.ruanyifeng.com/blog/2009/08/twos_complement.html
2、 下面介绍Java的一些数值类型转换规则
2.1、如果最初的数值类型是有符号的(分正负),那就执行符号扩展
2.2、如果是不带符号类型的(如char型),那就执行0扩展
2.3、如果目标类型的长度小于源类型的长度,则直接截取目标类型的长度,比如将int型转成byte型就直接截取int型的右边8位!
3、什么是符号扩展(Sign extension)
用于在数值类型转换时扩展二进制位的长度,以保证转换后的数值和原数值的符号(正或负)和大小相同,一般用于较窄的类型
(如byte)向较宽的类型(如int)转换。扩展二进制位长度指的是,在原数值的二进制位左边补齐若干个符号位(0表示正,1表示负)。
举例来说,如果用6个bit表示十进制数10,二进制码为"00 1010",如果将它进行符号扩展为16bits长度,结果是"0000 0000 0000 1010",
即在左边补上10个0(因为10是正数,符号为0),符号扩展前后数值的大小和符号都保持不变;如果用10bits表示十进制数-15,使用“2的补码
”编码后,二进制码为"11 1111 0001",如果将它进行符号扩展为16bits,结果是"1111 1111 1111 0001",即在左边补上6个1(因为-15是负数,符号为1),
符号扩展前后数值的大小和符号都保持不变。
4、什么是0扩展:
如果用6个bit表示十进制数10,二进制码为"00 1010",如果将它进行0扩展为16bits长度,结果是"0000 0000 0000 1010",
即在左边补上10个0(因为10是正数,符号为0)