JAVA中整数类型数据溢出问题研究
生活随笔
收集整理的這篇文章主要介紹了
JAVA中整数类型数据溢出问题研究
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Java中的數值類型都是有符號類型,最高位表示符號位。這里我們以byte類型為例,探討整型的數據溢出問題。
基本數據類型 對應的包裝類 所占bit位 取值范圍
byte Byte 8 -2^7 ~ 2^7-1
short Short 16 -2^15 ~ 2^15-1
int Integer 32 -2^31 ~ 2^31-1
long Long 64 -2^63 ~ 2^63-1
為啥取值范圍是這樣呢?下面我們慢慢來看下。
package com.lcx.datatype; /*** * @author**/ public class ByteTest {public static void main(String[] args) {bypeM();}public static void bypeM(){/*** Java中的數值類型都是有符號類型,最高位表示符號位。* 這里我們以byte類型為例,探討數據溢出問題* byte類型 占一個字節8個bit位,所以能表示的數值形式(注意不是數值范圍,因為第一位是符號位)是 0 000 0000 ~ 1 111 1111 也就是可以表示2^8-1+1 = 256個數字* 由于第一位是符號位,那么 * 正數的范圍是 0 000 0000 ~ 0 111 1111 --> 0 ~ 127* 負數的范圍是 1 000 0000 ~ 1 111 1111 -->-128~-1* 總的范圍是 1 000 0000 ~ 0 111 1111 -->-128 ~ 127(-2^7 ~ 2^7-1)* 同理 short、int、long 都是這樣* 計算機中,負數使用補碼形式表示,正數的原碼、反碼、補碼都相同,負數的反碼是符號位1除外其余取反,負數的補碼 = 反碼+1* 1 000 0001 -1的原碼* 1 111 1110 -1的反碼* 1 111 1111 -1的補碼* 通過這種方式 我們可以反推 1 111 1111 表示 -1* 這里的-128的補碼形式有點特殊,可以理解為數值包含符號位了,不知道下面這種解釋對不對。* 1 1000 0000 -128的原碼* 1 0111 1111 -128的反碼* 1 1000 0000 -128的補碼* 由于byte只能有8bit位,現在占9bit位, 多的那一位移除掉保留后面8位,-128的補碼 為 1000 0000* * 模擬數據溢出* Byte.MAX_VALUE = 0 111 1111 = 127,Byte.MAX_VALUE+1 = 1 000 0000 = -128,Byte.MAX_VALUE+2 = 1 000 0001(-->反碼1 000 0000-->原碼1 111 1111) = -127* Byte.MIN_VALUE = 1 000 0000 =-128,Byte.MIN_VALUE-1 = 0 111 1111 = 127,Byte.MIN_VALUE-2 = 0 111 1110 = 126*/Byte b_max_plus_1 = (byte) (Byte.MAX_VALUE + 1);//最大值+1 數據溢出到最小值Byte b_max_plus_2 = (byte) (Byte.MAX_VALUE + 2);Byte b_min_minus_1 = (byte) (Byte.MIN_VALUE - 1);//最小值-1 數據溢出到最大值Byte b_min_minus_2 = (byte) (Byte.MIN_VALUE - 2);System.out.println("Byte.BYTES="+Byte.BYTES);System.out.println("Byte.MAX_VALUE="+Byte.MAX_VALUE);System.out.println("Byte.MIN_VALUE="+Byte.MIN_VALUE);System.out.println("b_max_plus_1="+b_max_plus_1+","+"b_max_plus_2="+b_max_plus_2);System.out.println("b_min_minus_1="+b_min_minus_1+","+"b_min_minus_2="+b_min_minus_2);//Byte沒有打印二進制的工具函數,Integer有打印二進制的工具函數System.out.println("Byte.MAX_VALUE的二進制 = "+Integer.toBinaryString(Byte.MAX_VALUE));//前面為0的bit位沒有打印System.out.println("Byte.MIN_VALUE的二進制 = "+Integer.toBinaryString(Byte.MIN_VALUE));System.out.println("Integer.MAX_VALUE的二進制 = "+Integer.toBinaryString(Integer.MAX_VALUE));//第一位 符號位0 沒有打印System.out.println("Integer.MIN_VALUE的二進制 = "+Integer.toBinaryString(Integer.MIN_VALUE));} } 測試結果
總結
以上是生活随笔為你收集整理的JAVA中整数类型数据溢出问题研究的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java实现单例模式之饿汉式、懒汉式、枚
- 下一篇: LeetCode38.报数