随笔之java基本数据类型强制类型转换原理
例题:经过强制类型转化后,变量a,b的值分别是();
short a = 128; byte b = (byte) a;
答:a= 128;b= -128;
1.java中用补码形式表示。
2.第一位正负位,1表示负,0表示正。
3.原码:一个数的二进制表示。
4.反码:负数原码按位取反(符号位不变),正数原码本身。
5.补码:正数的原码本身,负数反码加1.
如:
3的原码 00000011 -3的原码 10000011
3的反码 00000011 -3的反码 11111100
3的补码 00000011 -3的补码 11111101
例题分析:
int占4个字节,32位;byte占1个字节,8位;所以强转时会截断前24位。(在内存中java是以补码表示一个数,所以表示形式是补码,不是原码)
int a=3 二进制补码表示:00000000 00000000 00000000 00000011
byte b=3 二进制补码表示:00000011
int a=-3 二进制补码表示: 11111111 11111111 11111111 11111101
byte b=-3 二进制补码表示: 11111101 原码:1000011
则int 128 转换为byte,
强转截取前补码(或原码):00000000 00000000 00000000 10000000
强转截取后补码: 10000000(即byte类型的补码)反码11111111 原码10000000
(注:byte在内存中一个字节范围是-128到127之间,对应原码11111111到01111111之间,在计算机中0有两种表示0000 0000和-0为1000 0000,为了充分利用资源1000 0000就表示-128)
总结:
1.已知负数补码,求负数:补码-1=反码,反码按位取反(除符号位);
2.已知负数,求负数补码:
i)按位取反(除符号位),加1
i))负数绝对值,按位取反(含符号位),加1