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.

     

     

     

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

报告相同问题?

悬赏问题

  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?