m0_58001999
m0_58001999
采纳率100%
2021-05-07 19:16 阅读 9

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

大佬帮忙解释下这里的强制类型转换是怎么把1200变成-80的?
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

1条回答 默认 最新

  • 已采纳
    qq_34124780 爱晚乏客游 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.

     

     

     

    点赞 评论 复制链接分享

相关推荐