我以Java中基本数据类型byte为例。byte的取值范围-128至127.
 public static void main(String[] args) {        byte a1 = (byte)512;//2的9次方
        byte a2 = (byte)513;
        byte a3 = (byte)520;//512+8
        byte a4 = (byte)640;//512+128
        byte a5 = (byte)641;//512+129
        byte a6 = (byte)-513;
        byte a7 = (byte)-520;
        byte a8 = (byte)-641;
        System.out.println(a1);//0
        System.out.println(a2);//1
        System.out.println(a3);//8
        System.out.println(a4);//-128
        System.out.println(a5);//-127
        System.out.println(a6);//-1
        System.out.println(a7);//-8
        System.out.println(a8);//127
    }
谁能从计算机原理的角度来分析为什么会是这个结果,或者推荐一本关于这方面的书籍也行

解决方案 »

  1.   

    Java对溢出的处理几乎为0,这一点还不如C++呢,C++好歹可以从寄存器里面读到溢出否。
    这一点C#也有很好的支持。你要自己判断是不是溢出了 
    得写点代码。
      

  2.   

    int 截取为byte 直接截取就行了
      

  3.   

    以byte a7 = (byte)-520;  为例吧:第一步:-520 在机器内部是2的补码,是:11111111111111111111110111111000
    第二步:由于强转成byte,因此取出其最低的8位,即:11111000赋值给a7
    第三步:补码为11111000对应的十进制数值是:-8
      

  4.   

    java中的int是32位的,java中负数是用补码表示的,非负数用原码表示
    byte是8位的。而将int型强制转化为byte时候是要截取字节的。
    你自己把上面的int型转换为二进制看看。然后再换算成十进制看看,和你的结果比比是不是一样。