解决方案 »

  1.   

    其实和if (off < 0 || len < 0 || (off + len) < 0 || (size - (off + len)) < 0)效果差不多
    唯一的区别在于,用逻辑或,只要碰到一个true马上停止,不会检查后面的东西,比如如果len<0,那么检查完off<0,len<0马上就去抛异常了,而不会继续检查后面的条件了
    而按位或,是一种运算,需要把四项的值都或一下,才会去判断是否<0,即便len<0,也要完成全部或才会去判断
      

  2.   


    如果是这个意思的话,那么 “off + len”这个表达式是不是多余的呢?
      

  3.   


    如果是这个意思的话,那么 “off + len”这个表达式是不是多余的呢?
    off+len是防止下标溢出,是很关键的
      

  4.   


    如果是这个意思的话,那么 “off + len”这个表达式是不是多余的呢?
    off+len是防止下标溢出,是很关键的
    如果off + len < 0 ,则off、len至少有一个为负数,就会先满足前面的条件了(off < 0 || len < 0),所以我觉得这个条件是多余的
      

  5.   


    如果是这个意思的话,那么 “off + len”这个表达式是不是多余的呢?
    off+len是防止下标溢出,是很关键的
    如果off + len < 0 ,则off、len至少有一个为负数,就会先满足前面的条件了(off < 0 || len < 0),所以我觉得这个条件是多余的
    整数范围是-2^31 ~ 2^31-1,你觉得比如两个2^31-1相加,结果还会是正数码?
    int off = Integer.MAX_VALUE, len = Integer.MAX_VALUE;
    System.out.println(off);
    System.out.println(len);
    System.out.println(off + len);
    输出
    2147483647
    2147483647
    -2
      

  6.   


    如果是这个意思的话,那么 “off + len”这个表达式是不是多余的呢?
    off+len是防止下标溢出,是很关键的
    如果off + len < 0 ,则off、len至少有一个为负数,就会先满足前面的条件了(off < 0 || len < 0),所以我觉得这个条件是多余的
    整数范围是-2^31 ~ 2^31-1,你觉得比如两个2^31-1相加,结果还会是正数码?
    int off = Integer.MAX_VALUE, len = Integer.MAX_VALUE;
    System.out.println(off);
    System.out.println(len);
    System.out.println(off + len);
    输出
    2147483647
    2147483647
    -2惊呆了! 原来起这个作用啊
      

  7.   

    看来,不能光有数学的思维,还得有计算机的思维。虽然分已经给了,但还是借这个帖子想问下,这int类型发生溢出为什么就一定变成负数了呢?
      

  8.   

    这和int的表示法有关,int是4字节的,从0x00000000~0xFFFFFFFF,本来是0~2^32-1的,但要表示负数就要变通一下,大多数语言规定从0x00000000~0x7FFFFFFF为正数,即0~2^31-1,而从0x80000000开始到0xFFFFFFFF为负数,即-2^31~-1。以上面的为例,Integer.MAX_VALUE是0x7FFFFFFF,
    0x7FFFFFFF+0x7FFFFFFF=0xFFFFFFFE
    而0xFFFFFFFE表示-2
      

  9.   

    这和int的表示法有关,int是4字节的,从0x00000000~0xFFFFFFFF,本来是0~2^32-1的,但要表示负数就要变通一下,大多数语言规定从0x00000000~0x7FFFFFFF为正数,即0~2^31-1,而从0x80000000开始到0xFFFFFFFF为负数,即-2^31~-1。以上面的为例,Integer.MAX_VALUE是0x7FFFFFFF,
    0x7FFFFFFF+0x7FFFFFFF=0xFFFFFFFE
    而0xFFFFFFFE表示-2
    学习了,谢谢你的耐心回复
      

  10.   

    int类型是4字节,那么可以表示2^32个数字,但是在Java当中没有C++中的无符号整数,所以这2^32个数字既要表示负数,又要表示正数,所以取了2^32的一半为负数,一半为正数,而0也非负数,所以正数的个数是2^31-1,负数的个数是2^31个,这样加起来正好是2^32次方个int类型的数据.
     而正数的最高位为0,负数最高位为1,溢出后的结果是否为负数,得看溢出后的最高位是否为0或者为1,不是说正数溢出就会为负数
    下面的语句输出就不会是负数,而是一个正数
    System.out.println(Integer.MAX_VALUE * 5);结果为2147483643
      

  11.   

    恩,int溢出一定为负数,是在相加的情况下,乘法则不一定