求助关于【位运算】的问题 位运算buffernio 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 其实和if (off < 0 || len < 0 || (off + len) < 0 || (size - (off + len)) < 0)效果差不多唯一的区别在于,用逻辑或,只要碰到一个true马上停止,不会检查后面的东西,比如如果len<0,那么检查完off<0,len<0马上就去抛异常了,而不会继续检查后面的条件了而按位或,是一种运算,需要把四项的值都或一下,才会去判断是否<0,即便len<0,也要完成全部或才会去判断 如果是这个意思的话,那么 “off + len”这个表达式是不是多余的呢? 如果是这个意思的话,那么 “off + len”这个表达式是不是多余的呢?off+len是防止下标溢出,是很关键的 如果是这个意思的话,那么 “off + len”这个表达式是不是多余的呢?off+len是防止下标溢出,是很关键的如果off + len < 0 ,则off、len至少有一个为负数,就会先满足前面的条件了(off < 0 || len < 0),所以我觉得这个条件是多余的 如果是这个意思的话,那么 “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);输出21474836472147483647-2 如果是这个意思的话,那么 “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);输出21474836472147483647-2惊呆了! 原来起这个作用啊 看来,不能光有数学的思维,还得有计算机的思维。虽然分已经给了,但还是借这个帖子想问下,这int类型发生溢出为什么就一定变成负数了呢? 这和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 这和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学习了,谢谢你的耐心回复 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 恩,int溢出一定为负数,是在相加的情况下,乘法则不一定 现在行业里面桌面应用程序(CS)用什么语言开发比较多? java中怎样使用别人的类库? 利用Eclipse3.5调试程序,为什么会陷入到JDK自带的函数中停顿,而无法到达我设置的断点? 关于字符流和编码 java Arc2D问题求助 关于JAVA中同一文件夹中不同程序文件中的类相互调用的疑问 编译通过后无法运行的问题 请问谁用过JUnit进行过软件测试?请帮忙 用Java 连接 SQLServer ,当使用事务时出现错误(再文件中),请问如何设置呢? CMP里面怎样处理自动增长的字段?怎样取回某字段的最大值? java byte[]数组循环合并 怎么让JFrame包括边框都是背景图片?
唯一的区别在于,用逻辑或,只要碰到一个true马上停止,不会检查后面的东西,比如如果len<0,那么检查完off<0,len<0马上就去抛异常了,而不会继续检查后面的条件了
而按位或,是一种运算,需要把四项的值都或一下,才会去判断是否<0,即便len<0,也要完成全部或才会去判断
如果是这个意思的话,那么 “off + len”这个表达式是不是多余的呢?
如果是这个意思的话,那么 “off + len”这个表达式是不是多余的呢?
off+len是防止下标溢出,是很关键的
如果是这个意思的话,那么 “off + len”这个表达式是不是多余的呢?
off+len是防止下标溢出,是很关键的
如果off + len < 0 ,则off、len至少有一个为负数,就会先满足前面的条件了(off < 0 || len < 0),所以我觉得这个条件是多余的
如果是这个意思的话,那么 “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
如果是这个意思的话,那么 “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惊呆了! 原来起这个作用啊
0x7FFFFFFF+0x7FFFFFFF=0xFFFFFFFE
而0xFFFFFFFE表示-2
0x7FFFFFFF+0x7FFFFFFF=0xFFFFFFFE
而0xFFFFFFFE表示-2
学习了,谢谢你的耐心回复
而正数的最高位为0,负数最高位为1,溢出后的结果是否为负数,得看溢出后的最高位是否为0或者为1,不是说正数溢出就会为负数
下面的语句输出就不会是负数,而是一个正数
System.out.println(Integer.MAX_VALUE * 5);结果为2147483643