m0_58001999 2021-05-07 19:16 采纳率: 100%
浏览 15
已采纳

大佬帮忙解释下这里的强制类型转换是怎么把1200变成-80的?

大佬帮忙解释下这里的强制类型转换是怎么把1200变成-80的?
  • 写回答

1条回答 默认 最新

  • 爱晚乏客游 2021-05-07 22:03
    关注

    java的byte数据类型类似于C/C++的char类型,取值都是[-128,127],也就是一个字节 ,8bite,而且在计算机内存当中负数都是以补码的形式存在的,所以-128(byte)在内存当中是1000 0000 (反码0111 1111 + 1) 而且第一位是符号位。int类型4个字节,32bite.

    重点就是,int在强制转成byte(c++的char)的时候会强制截断,也就是说32bite的int类型只要最后8bite!!!!

    所以1200=100 1011 0000(前面还有0我没写),在截断之后变成了1011 0000。然后再看我上面讲的,byte是有符号位的,所以第一位是符号位1,表示负数,1011 0000是一个负数,然后后面的就是补码转成原码的过程了。

    补码=反码+1 =(原码取反)+1  所以推理得到

    原码=(补码-1)再取反。

    1011 0000-1=1010 1111 取反=0101 0000=80。然后最重要的是,这个数是个负数,所以有:

    1200 =-80

    搞清楚原理之后,还有个简单的计算方法,那就是对256进行取模,看结果是不是在[-128,127]之间,如果不在,那么要再减去256就是最终的结果。

    比如1200%256=176>127.所以176-256=-80.

     

     

     

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 蓝牙耳机怎么查看日志
  • ¥15 Fluent齿轮搅油
  • ¥15 八爪鱼爬数据为什么自己停了
  • ¥15 交替优化波束形成和ris反射角使保密速率最大化
  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏