java当中int类型数据转换为byte类型的数据处理过程

大前提:目前来说所有数据在内存当中都是以补码的形式存在。

原码:原码(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

猜你喜欢

转载自blog.csdn.net/u013386606/article/details/80526486