强制类型转换中int转换为byte类型

int ii=666;

byte bb=(byte)ii;

System.out.println(bb);//打印得-102

今天学习Java时碰到这个问题,百思不得其解(原谅一个材料硕士刚刚转换,啥都不懂~~),找人问了一下,也算解决了,把笔记和思路分享一下。

首先我们在解决这道题之前,要了解二进制的概念,对于二进制数,最高位(从左开始的第一位,比如10011010的符号位就是左边开始的1)为符号位,0表示正数,1表示负数,剩余数值部分是真值.    

因为最高位是符号位,当符号位是1时,表明它是一个负数,负数在计算机中是以补码形式存在的,因此还需要换算成原码。 所有的数字在计算机底层都是以二进制形式存在的,原码是直接将一个数值换算成二进制数,但计算机以补码的形式保存所有的整数

补码的计算规则。1.正数的补码和原码完全相同

		     2.负数补码是其反码加1;反码是对原码按位取反,只有最高位(符号位)保持不变

以符号位为1(负数)为例

	10001110 补码

	反码转换为补码,反码加1得补码

	10001101 反码

	原码转换为反码,符号位不变,其他位取反

	11110010 原码

回到这题,可以理解为一个32bit(int)截取为8bit(byte),再经历一次求原码的过程

666对应32bit二进制为00000000 00000000 00000010 10011010(原码)

因此它的反码和补码如下:

00000000 00000000 00000010 10011010(反码)

00000000 00000000 00000010 10011010(补码)

截取8bit为10011010(截取补码),

截取后的补码第一位为符号位是1,所以是负的,数据位为0011010,求原码?

补码为10011010,反码为10011001,原码为11100110

根据计算((((1*2+1)22)*2+1)*2+1)*2=102,由于符号位为负(1),因此为-102
WX公众号(程学文的读书笔记)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值