如何取到强转后byte的值

引入模的概念

在经历了昨天学习计算机方法中的原码反码与补码后,找了很多资料与一些大佬的博客.学习到了一个新鲜的概念:模.

而对于byte这种有明确上限的数字范围来说,用"模"来计算它的取值,将会比二进制的补码这一方式更加简便且准确(个人见解).

什么是“模”

想象日常使用的钟表,它可以显示0~12点的时间,假设现在是2点钟,请用手动拨动时针的方式将时间减4小时,你会怎么做?

有两种方式:

1.逆时针将时针拨4小时

2.顺时针将时针拨8(12-4)小时

这里要讲的是第二种方式,为什么顺时针拨12-4也可以达到和正常思维的第一种方式一样的位置。

因为这个12,就是时钟的模.

或者换句话来说,时钟有12个位置,能够表达12个数字(0~11),这个表达范围就是它的模.

超出"模"范围的取值

那么在现在的电子表的24小时制中,他还是依靠着"模"这个概念----因为时钟12个小时一个轮回.我们不会说现在14点,只会说两点,那么超出了12的值,用模怎么取得呢,像时间一样,减去12.也就是它的"模".

很简单的例子,给两个正数,那么它们组合在一起能表达的数字范围就是0~99,(个位数就是01~09)

100就是它的模,那么我们要是用三位数强转为一个二位数比如说123,那么取得它的二位数的值就是23嘛(123-100).

byte的模

然后看到二进制当中,byte占一个字节,拥有8位的二进制数字表达,那么这八位能够表达的数字范围就是256个数字(2^8)二的八次方,那么这个256就是byte的模.

也就是说byte类型的数值最多能表达256个数字.

取值范围

然后,再套用上一篇文章中的符号位的概念,这256个数字中应该是被符号位的1和2的区分,划分成两个部分,正数部分和负数部分.那么将256平均分成两份,0~127是它的正数部分,-1到-128是它的负数部分.那么上一篇文章中byte的取值范围-128到127的问题也就顺利解决了.

强转后的取值

下面就用“模”的思路来对byte强转的取值,首先需要强转的数字肯定就是超出了-128~127这个范围之外的了,那么我们就用这个数字减去一个byte的模也就是256,比如说(byte)130,那么最后得到的数字就是130-256得到-126,这就是130强转byte之后的值了。

得到结论①

也就是说超过-128~127这个取值范围的数字我们直接减去256就得到强转的值了。

但是很快我们又遇到了一个新的问题,如果数字过大,得到的数字哪怕减去256了,也依然不是取值范围内的数字。

比如说1234,1234-256=978它依然不是byte取值范围的数字。

现在我们又回到时钟问题上,时钟是一个闭环,他只能表达12个数字也就是说超过了模的部分就直接进行到下一个闭环当中了,每次的闭环都是0~11。

那么同样引用到byte当中,他总是得到-128~127之间的数字,我们也可以把这个取值范围看成是一个闭环,这个闭环当中有256个数字,也就是它的模。

那么就简单了,每次都是256个数字循环,那就直接用这个数字对256取余,就得到了一个在byte的“模”范围之内的数字(我自己理解为这个数最后一次作256的循环的数字,也就是他在这个闭环当中的值)。

得到的这个数字如果在-128~127的取值范围之间,那么直接输出结果,如果还超过127了,就再减去256,得到它的值。

然后再来看这个1234,对256取余,得到210,超过了127,再减去256,得到-46。

那么(byte)1234最终得到的值就是-46,经过java程序验算,确实是这样。

最终得到结论

在java中byte强转一个数值最终得到的数字等于这个数对256取余,看在不在-128~127范围内,如果不在,再减去256,最终得到的值就是它强转之后的值。

byte n =(byte)m        ==>    if(m%256 >= -128 && m%256 <= 127){

                                                      n = m%256;   

                                                  }else{

                                                       n = m%256-256;

                                                  }

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值