官术网_书友最值得收藏!

2.1.2 特殊數字的表達

之前提到,Java語言不但支持大眾熟知的十進制數,也支持計算機特有的二進制數、八進制數和十六進制數??墒窃诮o數值變量賦值的時候,等號右邊的數字明顯屬于十進制,那么究竟要如何書寫其他進制的數字呢?為此Java規定了幾種數字前綴,以這些前綴開頭的數字就表示特定進制的數值,二進制、八進制和十六進制及其對應的前綴說明如下。

(1)二進制:該進制的數值以0b或者0B開頭,其后的數字只能是0和1。注意,b是binary(二進制)的首字母。

(2)八進制:該進制的數值以0開頭,其后的數字只能是0~7。

(3)十六進制:該進制的數值以0x或者0X開頭,其后的數字除了0~9之外,還包括字母a~f(不區分大小寫)。注意,x代表hexadecimal(十六進制)。

下面是聲明各種進制變量的代碼例子,依次演示二進制數、八進制數、十六進制數和十進制數的賦值操作(完整代碼見本章源碼的src\com\arithmetic\numerical\Prefix.java)。

public class Prefix {
    public static void main(String[] args) {
        int binary=0b11;  // 二進制數,0b也可以寫成0B
        System.out.println("binary="+binary);
        int octonary=011;  // 以0開頭,后面非bB、非xX的就是八進制數
        System.out.println("octonary="+octonary);
        int hexadecimal=0x11;  // 十六進制數,0x也可以寫成0X
        System.out.println("hexadecimal="+hexadecimal);
        int hexLetter=0xff;  // 十六進制數不區分大小寫,如ff也可以寫成FF
        System.out.println("hexadecimal="+hexLetter);
        int decimal=11;  // 若沒有任何前綴,則默認為十進制數
        System.out.println("decimal="+decimal);
    }
}

運行上述代碼,從運行窗口的日志觀察結果如下:

binary=3

octonary=9

hexadecimal=17

hexadecimal=255

decimal=11

可見二進制的0b11轉換成了十進制數為3,八進制的011轉換成了十進數為8,十六進制的0x11轉換成了十進數為17,十六進制的0xff轉換成了十進數為255。

由于int類型最大只能表示21億4千多萬的整數,因此再大的整數就要使用long類型變量了。例如,截至2018年元旦,世界總人口數達到7?444?443?881,使用long變量保存世界人口的話,賦值代碼本應如下:

        long worldPopulation=7444443881;  // 這樣寫會報錯,因為整數默認是int類型

誰料IDEA居然報錯,提示Integer number too large,意思是該數字超出了int類型的表示范圍。原來Java里面的整數默認是整型的,只分配4字節的臨時空間,然而7444443881超出了整型數的范圍,致使默認的存儲空間不夠用了。要想擴大臨時的存儲空間,得在數字后面補上小寫的l或者大寫的L,表示該整數要求分配8字節的長整型臨時空間,這樣才供得起7444443881這個大神。于是修改后的長整型賦值代碼如下(完整代碼見本章源碼的src\com\arithmetic\numerical\Suffix.java):

        // 截至2018年元旦,世界人口大約有74億
        long worldPopulation=7444443881L;  // 長整型數要在數值末尾加上l或者L
        System.out.println("worldPopulation="+worldPopulation);

注意,上面的代碼末尾的L只表示數據類型,變量值并不包括L這個字母。運行測試代碼,可見日志打印結果為“worldPopulation=7444443881”。

剛提到Java的整數默認是整型的,相對應的,Java的小數默認是雙精度類型的,那么試試下面的代碼能否將小數賦值給float變量?

        float huilv=3.14;  // 這樣寫會報錯,因為小數默認是double類型的

果然IDEA提示出錯了“Incompatible types”,意思是類型不匹配,正確的寫法要在小數末尾補上小寫的f或者大寫的F,表示該小數按照浮點數類型分配存儲空間。改寫后的浮點數賦值代碼如下:

        // 3.14是中國古代數學家劉徽求得的圓周率數值,又稱徽率
        float huilv=3.14F;  // 浮點數要在數值末尾加上f或者F
        System.out.println("huilv="+huilv);

其實小數后面也可以補上d或者D,表示該小數按照雙精度類型分配存儲空間,只是因為Java的小數默認就是double類型的,所以小數后面的D可加可不加,不影響正常的編譯。

這下幾種數字類型都能夠正確地賦值了。但是還有一個細節問題,當數字的位數很多的時候,后面有多少個零會讓初學者看得眼花繚亂?,F實生活中,整數通常每隔4位就在中間補上空格或者補上逗號。譬如中國的領土面積是960萬平方公里,實際書寫一般為9?600?000或者9,600,000,這樣可以很清楚地區分萬的單位乃至億的單位。從Java 7開始,允許在數字中間插入下畫線作為分隔符,下畫線本身沒有保存到變量中,它的作用類似前面的空格和逗號,僅僅是方便程序員數清具體的位數而已。

下面是在數字變量賦值時添加下畫線的代碼例子:

    // 中國的領土面積是960萬平方千米
    int chinaArea=960_0000;  // 從Java 7開始,數字中間允許添加下畫線,從而可以更方便地區分位數
    System.out.println("chinaArea="+chinaArea);

雖然下畫線方便了程序員數數,數字的長度卻變得更長了,倘若再來一個更大的整數,例如太陽到地球的距離為1.5億千米,展開可是150000000千米,Java賦值加了下畫線則為1_5000_0000,此時后面拖了許多個零。在數學上,可以通過科學記數法表示這種較大的數,也就是把一個數書寫成a×10n的形式(1≤a<10)。Java代碼也有與科學記數法類似的表達方式,像1.5億這個數字,其實等于1.5×108,在代碼中可以通過E8或者e8表示108,于是采取科學記數法的Java賦值代碼如下:

        // 太陽距離地球1.5億千米
        double sunDistance=1.5E8;  // E8表示乘以108,E是exponent(指數)的首字母
        System.out.println("sunDistance="+sunDistance);

注意上述代碼中的1.5是小數,所以必須使用雙精度數作為賦值變量,而不能用整型或長整型數。即使E前面的數字是整數,該變量也只能是雙精度類型,因為Java約定了科學記數法專用于雙精度數字。

主站蜘蛛池模板: 南昌市| 尼木县| 盐源县| 象州县| 油尖旺区| 仙桃市| 津南区| 宝丰县| 革吉县| 遵化市| 古交市| 溧水县| 上林县| 册亨县| 阿克陶县| 灵丘县| 平定县| 沙雅县| 沈阳市| 东辽县| 南城县| 余干县| 延庆县| 上蔡县| 陈巴尔虎旗| 巩义市| 大化| 连平县| 苏尼特左旗| 清水县| 昌黎县| 多伦县| 昌黎县| 襄樊市| 廊坊市| 共和县| 东明县| 碌曲县| 德格县| 临西县| 休宁县|