今天在做一道oj题的时候,遇到了一个情景,需要判断经过操作后的int类型数是否越界。我直接很暴力地比较和int类型的最大最小值来判断是否越界。但还想思考一下用位运算判断是否越界的方法,顺便巩固一下位运算和补码的知识。
//resault是long类型变量,语言是java
if(resault>Integer.MAX_VALUE||resault<Integer.MIN_VALUE) {
System.out.println("发生溢出");
}
情景描述:
现用一个long类型变量存储一个整形数,要求判断将其强转成int类型是否会发生溢出。
问题分析:
int整形占4个字节,long整形占8个字节,若无溢出现象发生,正数的前32位均是0,负数的前32位均是1.所以即判断该变量前32位是否全0或全1,若是则无溢出现象。
且运算:
若前32位不是全1,全0,则可以判断其发生了溢出。或运算与且大同小异。
if ( (resault&0xFFFFFFFF00000000L )!= 0xFFFFFFFF00000000L &&
(resault&0xFFFFFFFF00000000L)!=0 ) {
System.out.println("发生溢出");
}
注意运算优先级
移位运算:
左移的本质是乘法,右移的本质是除法,除以2^n,对正数来说,除不尽舍去。对负数来说,除不尽商-1,因此正数能右移得到0,而负数无论怎么右移最大也只能得到-1,无法为0,成为1111……的形式。
if ( (resault>>32) != 0 && (resault>>32) != -1) {
System.out.println("发生溢出");
}
网友评论