百度推广 帮做网站吗,红安县城乡建设局官方网站,系统首页设计,甘肃建设职工教育培训中心网站Java中的负数取绝对值结果为什么不一定是正数#xff1f; ✅典型解析✅扩展知识仓✅整型的取值范围✅超出范围怎么办 ✅典型解析 假如#xff0c;我们要用Math.abs对一个nteger取绝对值的时候#xff0c;如果用如下方式: Math .abs(orderId.hashCode());得到的结果可能是个负… Java中的负数取绝对值结果为什么不一定是正数 ✅典型解析✅扩展知识仓✅整型的取值范围✅超出范围怎么办 ✅典型解析 假如我们要用Math.abs对一个nteger取绝对值的时候如果用如下方式: Math .abs(orderId.hashCode());得到的结果可能是个负数。原因要从Integer的取值范围说起int的取值范围是-2^31—— (2^31)-1即-2147483648 至 2147483647。 那么当我们使用abs取绝对值时候想要取得-2147483648的绝对值那应该是2147483648。但是2147483648大于了2147483647即超过了int的取值范围。这时候就会发生越界。 2147483647用 进制的 码表示是: 01111111 11111111 11111111 11111111 这个数 1 得到: 1000000 00000000 00000000 0000000 这个二进制就是-2147483648的补码。 虽然这种情况发生的概率很低只有当要取绝对值的数字是-2147483648的时候得到的数字还是个负数。 那么如何解决这个问题呢? 既然是因为越界了导致最终结果变成负数那就解决越界的问题就行了那就是在取绝对值之前把这个int类型转成long类型这样就不会出现越界了。 如前面我们取值逻辑修改为 Math.abs((long)orderId.hashCode());就万无一失了。 大家可以执行下以下代码 public static void main(String[] args) {system.out.println(Math.abs((long)Integer .MIN VALUE));
}得到的结果就是: ✅扩展知识仓
✅整型的取值范围 Java中的整型主要包含byte、short、int和long这四种表示的数字范围也是从小到大的之所以表示范围不同主要和他们存储数据时所占的字节数有关。 先来个简单的科普1字节8位 (bit) 。java中的整型属于有符号数。 先来看计算中8bit可以表示的数字 最小值: 10000000 (-128) (-2^7) 最大值: 01111111 (127)(2^7-1) 整型的这几个类型中
byte: byte用1个字节来存储范围为-128(-2^7) 到 127(2^7-1)在变量初始化的时候byte类型的默认值为0。short: short用2个字节存储范围为-32,768 (-2^15) 到 32,767(2^15-1)在变量初始化的时候short类型的默认值为0一般情况下因为Java本身转型的原因可以直接写为0。int: int用4个字节存储范围为-2,147,483,648(-2^31) 到 2,147,483,647 (2^31-1)在变量初始化的时候int类型的默认值为0。long: long用8 字节存储,范为-9,223,372,036,854,775,808(-2^63 ) 到 9 223.372,036 854775.80(2^63-1)在变量初始化的时候long类型的默认值为0L或0l也可直接写为0。 ✅超出范围怎么办 上面说过了整型中每个类型都有一定的表示范围但是在程序中有些计算会导致超出表示范围即溢出。如以下代码: int i IntegerMAX VALUE;
int j Integer.MAX VALUE;
int k i j;
System.out.println(i ( i)j( j) k( k )); 输出结果: i(2147483647) j(2147483647) k (-2) 这就是发生了溢出溢出的时候并不会抛异常也没有任何提示。所以在程序中使用同类型的数据进行运算的时候一定要注意数据溢出的问题。