日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JAVA中整数类型数据溢出问题研究

發布時間:2025/3/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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中整数类型数据溢出问题研究的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。