国产TS紫迹丝袜高跟鞋在线,一区二区三区国产自产视频免费,67pao国产人成视频,午国产午夜激无码毛片不卡

愛碼網(wǎng)專注于資源免費(fèi)下載

Java解惑之表達(dá)式謎題(謎題5:十六進(jìn)制的趣事)

謎題5:十六進(jìn)制的趣事

Java解惑之表達(dá)式謎題(謎題5:十六進(jìn)制的趣事)-第1張圖片

下面的程序是對(duì)兩個(gè)十六進(jìn)制(hex)字面常量進(jìn)行相加,然后打印出十六進(jìn)制的結(jié)果。這個(gè)程序會(huì)打印出什么呢?  

public class JoyOfHex{
               public static void main(String[] args){
                         System.out.println(
                                     Long.toHexString(0x100000000L + 0xcafebabe));
            }
}

看起來很明顯,該程序應(yīng)該打印出1cafebabe。畢竟,這確實(shí)就是十六進(jìn)制數(shù)字10000000016與cafebabe16的和。該程序使用的是long型運(yùn)算,它可以支持16位十六進(jìn)制數(shù),因此運(yùn)算溢出是不可能的。 然而,如果你運(yùn)行該程序,你就會(huì)發(fā)現(xiàn)它打印出來的是cafebabe,并沒有任何前導(dǎo)的1。這個(gè)輸出表示的是正確結(jié)果的低32位,但是不知何故,第33位丟失

了。 

看起來程序好像執(zhí)行的是int型運(yùn)算而不是long型運(yùn)算,或者是忘了加第一個(gè)操作數(shù)。這里到底發(fā)生了什么呢? 十進(jìn)制字面常量具有一個(gè)很好的屬性,即所有的十進(jìn)制字面常量都是正的,而十六進(jìn)制或是八進(jìn)制字面常量并不具備這個(gè)屬性。要想書寫一個(gè)負(fù)的十進(jìn)制常量,可以使用一元取反操作符(-)連接一個(gè)十進(jìn)制字面常量。以這種方式,你可以用十進(jìn)制來書寫任何int或long型的數(shù)值,不管它是正的還是負(fù)的,并且負(fù)的十進(jìn)制常數(shù)可以很明確地用一個(gè)減號(hào)符號(hào)來標(biāo)識(shí)。但是十六進(jìn)制和八進(jìn)制字面常量并不是這么回事,它們可以具有正的以及負(fù)的數(shù)值。如果十六進(jìn)制和八進(jìn)制字面常量的最高位被置位了,那么它們就是負(fù)數(shù)。在這個(gè)程序中,數(shù)字0xcafebabe是一個(gè)int常量,它的最高位被置位了,所以它是一個(gè)負(fù)數(shù)。它等于十進(jìn)制數(shù)值-889275714。 


該程序執(zhí)行的這個(gè)加法是一種“混合類型的計(jì)算(mixed-type computation): 左操作數(shù)是long類型的,而右操作數(shù)是int類型的。為了執(zhí)行該計(jì)算,Java將

int類型的數(shù)值用拓寬原始類型轉(zhuǎn)換提升為一個(gè)long類型,然后對(duì)兩個(gè)long類型數(shù)值相加。因?yàn)閕nt是一個(gè)有符號(hào)的整數(shù)類型,所以這個(gè)轉(zhuǎn)換執(zhí)行的是符合擴(kuò)

展:它將負(fù)的int類型的數(shù)值提升為一個(gè)在數(shù)值上相等的long類型數(shù)值。  這個(gè)加法的右操作數(shù)0xcafebabe被提升為了long類型的數(shù)值0xffffffffcafebabeL。這個(gè)數(shù)值之后被加到了左操作數(shù)0x100000000L上。當(dāng)作為int類型來被審視時(shí),經(jīng)過符號(hào)擴(kuò)展之后的右操作數(shù)的高32位是-1,而左操作數(shù)的高32位是1,將這兩個(gè)數(shù)值相加就得到了0,這也就解釋了為什么在程序輸出中前導(dǎo)1丟失了。下面所示是用手寫的加法實(shí)現(xiàn)。(在加法上面的數(shù)字是進(jìn)位。) 


    1111111

  0xffffffffcafebabeL

+ 0x0000000100000000L

---------------------

  0x00000000cafebabeL


訂正該程序非常簡單,只需用一個(gè)long十六進(jìn)制字面常量來表示右操作數(shù)即可。這就可以避免了具有破壞力的符號(hào)擴(kuò)展,并且程序也就可以打印出我們所期的

結(jié)果1cafebabe:  

public class JoyOfHex{
               public static void main(String[] args){
                         System.out.println(
                                   Long.toHexString(0x100000000L + 0xcafebabeL));
            }
}


這個(gè)謎題給我們的教訓(xùn)是:混合類型的計(jì)算可能會(huì)產(chǎn)生混淆,尤其是十六進(jìn)制和八進(jìn)制字面常量無需顯式的減號(hào)符號(hào)就可以表示負(fù)的數(shù)值。為了避免這種窘境,

通常最好是避免混合類型的計(jì)算。對(duì)于語言的設(shè)計(jì)者們來說,應(yīng)該考慮支持無符號(hào)的整數(shù)類型,從而根除符號(hào)擴(kuò)展的可能性??赡軙?huì)有這樣的爭辯:負(fù)的十六進(jìn)

制和八進(jìn)制字面常量應(yīng)該被禁用,但是這可能會(huì)挫傷程序員,他們經(jīng)常使用十六進(jìn)制字面常量來表示那些符號(hào)沒有任何重要含義的數(shù)值。 


本文鏈接:http://fangxuan.com.cn/article/283.html

網(wǎng)友評(píng)論

熱門文章
隨機(jī)文章
熱門標(biāo)簽
側(cè)欄廣告位