Java中的二进制
計算機看似能干很多活,其實也很笨,只認識0和1。因為電路的邏輯只有0和1兩個狀態,這里的0和1并不是數字的0和1,0和1是表示兩種不同的狀態,0表示低電平,1表示高電平。計算機是由無數個邏輯電路組成的,通過0和1的無限位數和組合來表達信息。也就是說,計算機是采用二進制來表示數據的。為了說清楚二進制,先說一下我們生活中常用的十進制,十進制看起來很簡單,那是因為我們從小接受的就是十進制的教育:
這是一個普通的十進制數,八十三萬七千零五十六,這個數字可以表示如下:
再來看看二進制
這是一個二進制數101011,這個數字可以表示如下:
和十進制一樣,只不過把底數(冪)從10變成了2,用十進制表示二進制里的101011就是43。有一點Java基礎的人,都知道int類型在Java中是占4個字節的,1個字節8位,43表示如下:
其中每段為1個字節,一個字節是8位,首位表示符號位。在Java中,負數是用補碼來表示的,也就是其絕對值取反加1得到的,并用首位來標識符號位為負數,看一下-43是怎么表示的:
相信看到這里,大家就知道為什么int能表示的最大數和最小數分別是2147483647和-2147483648了。先看int的最大值2147483647,二進制是這樣表示的,原來并不是定義的,只是說實在裝不下了
再看看int里的最小值-2147483648,二進制是這樣表示的
寫到這兒了,再擴展一下知識點吧,來看一下32位的int類型轉換成16位的short類型時,系統是怎么轉換的,隨手寫了一個二進制數,相當于十進制的20080557
準備轉換,截掉前面的16位
取后面的16位,并把第1位變為符號位
強制轉換以后,十進制的20080557變成了十進制的26541,怎么樣,簡單吧。
有人說,好麻煩,每次都要這么算嗎?不用擔心,Java提供了豐富的API來供我們使用,我們寫一段代碼來測試一下
public static void main(String[] args) {System.out.println("int最大正數:" + Integer.MAX_VALUE);System.out.println("int最大正數二進制表示:" + Integer.toBinaryString(Integer.MAX_VALUE));System.out.println("int最小負數:" + Integer.MIN_VALUE);System.out.println("int最小負數二進制表示:" + Integer.toBinaryString(Integer.MIN_VALUE));System.out.println("二進制定義打印int能表示的最大數:" + 0b01111111_11111111_11111111_11111111);System.out.println("二進制定義打印int能表示的最小數:" + 0b10000000_00000000_00000000_00000000);System.out.println("43的二進制表現:" + Integer.toBinaryString(43));//結果省略了前面的0System.out.println("-43的二進制表現:" + Integer.toBinaryString(-43));//下劃線無意義,只是為了方便看,可以隨意寫int a = 0b00000000_00000000_00000000_00000000_00101011;//0b表示為二進制,a相當于十進制的43int a1 = 0b101011;//這也是十進制的43,只不過省略了上面的0System.out.println("打印a的值:" + a);System.out.println("打印a1的值:" + a1);int b = 0b11111111_11111111_111111111_1010101;//二進制43取反加1,變成-43,下劃線無意義System.out.println("打印b的值:" + b);int i = 0b00000001_00110010_01100111_10101101;//隨手寫了個十進制的24274861System.out.println("打印10進制的i:" + i);System.out.println("打印強制轉換為short的i:" + (short)i);System.out.println("打印short的二進制表示:" + Integer.toBinaryString((short)i)); }最后我們來看一下結果
整理了一個表格,幫大家回顧一下Java中的四種整形,byte,short,long這三種類型本文就不詳細解說了,其中API的調用都是一樣的
思考以下代碼執行結果,結合本文中的圖片一起看
總結
- 上一篇: Java进阶:Set、Map线程安全问题
- 下一篇: Java进阶:图文并茂解析HashMap