本人初学java,有很多搞不懂的问题,希望大家多多指教。
1. short s2 = (short)33330; //33330默认是int类型
System.out.println("s2的值是---->"+s2);//运行结果是-32206
2. int int2 = -3;
byte b4 = (byte)int2;
System.out.println("b4的值是---->"+b4);//运行结果是-3
上面这两个问题运行结果都出来了,但就是搞不懂里面的运算过程。希望大家能够给我讲一下这里面的换算过程。非常感谢~~~
System.out.println("s2的值是---->"+s2);//运行结果是-32206知道short的字长 和 补码的概念么。
你再分别试试看:
short s2 = (short) 32767;
short s2 = (short) 32768;
00000000 00000000 10000010 00110010,进行short强制转换后,变成了:
10000010 00110010,其最高位为1,就表示负数了。-32206。
33330超过了32767,相当于33330-65536=-32206
33330这个数(int型)的2进制表示是:
00000000 00000000 10000010 00110010,进行short强制转换后,变成了:
10000010 00110010,其最高位为1,就表示负数了。-32206。
33330转换成二进制是00000000,00000000,10000010,00110010
强制转换成short是10000010,00110010(补码)
因为符号位是1,所以是负数,对于负数又有补码=反码+1
所以反码是:10000010,00110001(反码)
所以再转换成源码就是:11111101,11001110(符号位不变,其余取反)
所以转换成short就是32206(符号位不参与运算)
因为是负数,所以是-32206。
这个过程对吧,可是我算二楼的32768这个边界的数时,老弄混,还在计算中 呵呵
谢谢帮忙哦~~
例如:byte b2= (byte)385;
System.out.println("b1的值是--->"+b2);//结果是-127
32768转换成二进制是00000000,00000000,10000000,00000000
强制转换成short是10000000,00000000(补码)
因为符号位是1,所以是负数,对于负数又有补码=反码+1
所以反码是:01111111,11111111(反码)
所以再转换成源码就是:00000000,00000000(符号位不变,其余取反)
结果没法计算了,不知道错在哪里,帮我看看。谢谢 嘿嘿
你把自己绕糊涂了吧?先算个简单的:◎ System.out.println((short) 65535);
65535转换成二进制是00000000,00000000,11111111,11111111
强制转换成short是11111111,11111111(补码)
因为符号位是1,所以是负数,那么如何知道该补码所实际表示的负数是多少呢?
很简单,前面带上符号“-”,然后整串取反再加一,如下:
先取反:- 00000000,00000000
再加一:- 00000000,00000001
所以: -1◎ System.out.println((short) 32768);
65535转换成二进制是00000000,00000000,10000000,00000000
强制转换成short是10000000,00000000(补码)
因为符号位是1,所以是负数,那么如何知道该补码所实际表示的负数是多少呢?
很简单,前面带上符号“-”,然后整串取反再加一,即得:
先取反:- 01111111,11111111
再加一:- 10000000,00000000
所以:-32768
恩恩 这个懂了。呵呵 下面这个是我自己算的步骤,可能咱们的方法不一样 不过你的那种挺简单的。我的这个也没问题吧?
33330转换成二进制是00000000,00000000,10000010,00110010
强制转换成short是10000010,00110010(补码)
因为符号位是1,所以是负数,对于负数又有补码=反码+1
所以反码是:10000010,00110001(反码)
所以再转换成源码就是:11111101,11001110(符号位不变,其余取反)
所以转换成short就是32206(符号位不参与运算)
因为是负数,所以是-32206。另外还有一种比较简单的,你看下 ,我也不确定是不是完全正确。
short的取值范围是-32768~32767,32768(要计算的数)超过这个范围了所以是负数,所以用32768-32767=1,然后再用32768-1+1=32768。所以最后就是-32768.我把同一个数用同样的颜色标出来。你看下对么。
short 16位带符号数 -32768—32767
int 32位带符号数 -2147483648 — 2147483647 int ——short —— byte 这个过程需要强制类型转换,
byte——short——int 这个过程不需要强制转换类型
补上一道类似的
你试着做吧。
这道做出来了,其它的应该也就没问题了