数据转换与超出范围的输出(128与-128)

为什么需要我们手动进行大的数据类型转小的数据类型

我们的计算机可以自主进行数据类型的小转大,但无法自主进行大转小的操作,此时我们就需要进行强制转换。但为什么不能?以int与byte来说,int为4字节,即二进制位数32;byte为1字节,即二进制位数为8。把int转为byte,就要把它的所有数据装进byte的小盒子里,就算是int a=10;byte b=a;哪怕int里就是一个小小的10,在二进制表示中还是有很多位,即0000 0000 0000 0000 0000 0000 0000 1010,byte的八个位置的小盒子装不下32位的数。此时不进行强制转换,会报错
在这里插入图片描述
对这样的情况,就可以int a=10;byte b=(byte)a;此时就可以输出b=10;

强制转换不可用的情况

强制转换的原理是切除,切除去前面的数据,只将后面的可以“装下”的数据保留下来。因此,强制转换不是处处都可以用的,强行使用会造成数据信息的丢失。不可用的情况,是大的数据类型数字太大,超过小的数据类型,此时强制转换,结果绝对不会是好的,如0100 0000 0000 0000 0000 0000 0000 0000,如128与-128的情况,本质也是128这个数超过了byte的范围(-128-127)。
在这里插入图片描述
但在这个基础上,我们来讲讲为什么是输出-128

原码,反码,补码

(为什么存在以及详细的解释加油自己去查,推荐链接

正数的原码,反码,补码都是原码;
负数的反码是原码除第一位(符号位)外其余都求反,补码是在反码的基础上加一;
我总结一个规律,如byte中-1的补码1111 1111,将第一位换为0就是127的原码0111 1111,进而得出一个想法,“负数的补码除第一位为1,其余数字与其绝对值相补的数的原码相同”,即|-1|+127=128。如何判断相补?byte的范围是-128~127,共256位,256/2=128,相加等于128就行。
因为计算机存储数据是存储其补码,但是总的大致是第一位是0就是正,是1就是负,为此就出现了128变输出-128的情况—128的补码为0000 0000 1000 000(原补相同)强行转换数据类型切除后就是1000 0000,1就位于符号位,计算机认为是负数,又-128与0相补(-0为0000 0000,+0为1000 0000),输出就是-128(此处“计算机认为”没有依据,我为了使人(就你们)理解这么说)
顺便一提,-128没有原码和反码哦(原因自己查)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值