War-Horse 发表于 2017-7-26 00:58

Java-关于强制转换数据溢出后的结果的问题

今晚做了一个关于强制类型转换数据溢出后的结果的练习题,发现控制台输出的结果和自己手动算出来的结果不一样,查看了几次没有发现错误原因,所以到论坛请教各位前辈!这是程序
class DataTypeDemo7HomeWork {
      public static void main(String[] args) {
                //练习:byte b = 300;
               
                //byte的范围是:-128~127
                //300不在byte的范围内,所以报错。
                //byte b = 300;
               
                byte b = (byte) 300;
                //那么,将int类型的300强制转换成byte类型后的输出结果是...
                System.out.println(b);
               
      }
}
下面是我手动计算的步骤



最后我的计算结果是84,而通过控制台输出的结果是44.究竟是哪一步出了问题,求指正!

War-Horse 发表于 2017-7-26 08:54

找到问题所在了,最后那一步,求原码那步。我忽略了一个点,就是符号位是正的,原反补相同。

SeriousSnow 发表于 2017-7-26 01:11

300 是 0....100101100
byte类型么
0 0101100
不就是44

wolf豪 发表于 2017-7-26 01:17

byte不是8字节嘛,然后取前八位,0 0101100   32+8+4=44

chenny 发表于 2017-7-26 02:34

直接取300 化成2进制的后8位 算出来就44.
后8位开头第一位是0,说明是正数,你还算补码什么的干嘛

qianeymax6274 发表于 2017-7-26 03:10

太给力了,谢谢兄弟们

War-Horse 发表于 2017-7-26 08:40

SeriousSnow 发表于 2017-7-26 01:11
300 是 0....100101100
byte类型么
0 0101100


这...计算机运算数据是用补码运算的,所以得到300的二进制还要求出它的补码,将补码运算完了之后再表现成原码,得出强制类型转换后的二进制。

War-Horse 发表于 2017-7-26 08:41

wolf豪 发表于 2017-7-26 01:17
byte不是8字节嘛,然后取前八位,0 0101100   32+8+4=44

byte是一个字节,有8 bit。你这样算就跟上面的评论一样

War-Horse 发表于 2017-7-26 08:43

chenny 发表于 2017-7-26 02:34
直接取300 化成2进制的后8位 算出来就44.
后8位开头第一位是0,说明是正数,你还算补码什么的干嘛

这个练习题主要就是测试整个运算过程,所以需要按照上面的步骤来,上面的步骤就是模仿计算机是如何处理这个数据的

SeriousSnow 发表于 2017-7-26 10:07

War-Horse 发表于 2017-7-26 08:40
这...计算机运算数据是用补码运算的,所以得到300的二进制还要求出它的补码,将补码运算完了之后再表现 ...
要死了,正数补码原码有区别吗?
页: [1]
查看完整版本: Java-关于强制转换数据溢出后的结果的问题