大前提:目前来说所有数据在内存当中都是以补码的形式存在。
原码:原码(true form)是一种计算机中对数字的二进制定点表示方法。
原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该
位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小。
反码:负数由原码取反获得,正数不变,符号位保持不变
补码:负数的补码由反码加1获得,正数的原码与补码相等
基础知识学习:
1.关于byte类型取值范围分析
在java当中byte类型只占一个字节,一个字节等于8位,其中最高位表示符号位0代表正数,1代表负数,
因此正数最大可以表示的正数为0111 1111(2)转化为10进制为127。正数最小可以表示0000 0000(2)
也就是0。
因为最高为代表符号位因此就出现了0000 0000(2)和1000 0000(2)也就是+0和-0,我们默认0
就是代表+0,没有-0这一说法,因此多出了1000 0000(2),1111 1111代表-127,1000 0000代表
-1,也就是从-1到-127都有数表示了,因此我们规定1000 0000(2)代表-128。
由上面分析我们可以确认byte的取值范围为[-128,127]。
2.关于int类型的取值范围分析
在java当中int类型占用4个字节,一个字节等于8位,所以总共32位,正数从0开始,负数从-1开始,
因此取值范围为:[-2^31, 2^31 - 1];
3.进入正题,int转换为byte类型过程
例子1:int类型1转换为byte类型
byte a = 1;
1的原码:
0000 0000 0000 0000 0000 0000 0000 0001
1的补码:
0000 0000 0000 0000 0000 0000 0000 0001
转换为byte丢掉高位3个字节得到:
0000 0001
最高位为0,即是正数,因此补码与原码一致,转为为10进制为1。
例子2:int类型128转换为byte类型
byte a = 128;
128的原码:
0000 0000 0000 0000 0000 0000 1000 0000
128的补码:
0000 0000 0000 0000 0000 0000 1000 0000
转换为byte丢掉高位3个字节得到:
1000 0000
最高位为1,即是负数,因此需要转换为原码:
反码:1111 1111
原码:1000 0000
因为我们约定-0代表-128,因此转换为10进制为-128
例子3:int类型129转换为byte类型
byte a = 129;
129的原码:
0000 0000 0000 0000 0000 0000 1000 0001
129的补码:
0000 0000 0000 0000 0000 0000 1000 0001
转换为byte丢掉高位3个字节得到:
1000 0001
最高位为1,即是负数,因此需要转换为原码:
反码:1111 1110
原码:1111 1111
因此转换为10进制为-127
例子4:int类型-128转换为byte类型
byte a = -128;
-128的原码:
1000 0000 0000 0000 0000 0000 1000 0000
-128的补码:
1111 1111 1111 1111 1111 1111 1000 0000
转换为byte丢掉高位3个字节得到:
1000 0000
最高位为1,即是负数,因此需要转换为原码:
反码:1111 1111
原码:1000 0000
因此转换为10进制为-128
例子5:int类型-129转换为byte类型
byte a = -129;
-129的原码:
1000 0000 0000 0000 0000 0000 1000 0001
-129的补码:
1111 1111 1111 1111 1111 1111 0111 1111
转换为byte丢掉高位3个字节得到:
0111 1111
最高位为0,即是正数,因此转换为10进制为127
4.关于n进制的数左移
一个n进制的数N左移m位后得到的数为:N * n^m
例如
十进制的4左移1位,4 * 10^1 = 40
二进制的4左移3位,也就是等于4 * 2^3 = 32
100<<3 变为 100000转为2进制为32
5.关于n进制的数右移
一个n进制的数N右移m位后得到的数为:N / (n^m)
例如
十进制的4右移1为,4/10 = 0
二进制的16右移3位,也就是等于16/(2^3) = 2
10000>>3 变为 10转为2进制为2