學(xué)習(xí)過(guò)java的都知道,在java中,不是直觀的表示負(fù)數(shù),而是采用補(bǔ)碼的形式表示負(fù)數(shù)。
這是為了硬件操作的方便,把減法也轉(zhuǎn)換成加法來(lái)運(yùn)算。
那補(bǔ)碼是怎樣表示的呢?為了得到補(bǔ)碼,我們引入了反碼。
對(duì)于正數(shù)來(lái)講,它的反碼補(bǔ)碼都為本身,如果不明白為什么,我們可以這樣理解:引入反碼補(bǔ)碼的原因就是為了解決減法的問(wèn)題,換句話數(shù)就是解決java中負(fù)數(shù)的問(wèn)題,正數(shù)不存在這些問(wèn)題,所以它的反碼補(bǔ)碼就是它本身。在有符號(hào)的基本數(shù)據(jù)類型中,最高位0表示正數(shù),最高位1表示負(fù)數(shù)。 對(duì)于負(fù)數(shù)來(lái)講,它的反碼就是除去符號(hào)位取反,然后加1就得到了它的補(bǔ)碼。
這里舉個(gè)簡(jiǎn)單的例子,一個(gè)byte型數(shù)據(jù),它在計(jì)算機(jī)中占8位,-7可以表示為10000111,最高位的1代表負(fù)號(hào),它的反碼是除去符號(hào)位各位取反為11111000,然后加1得到補(bǔ)碼11111001。
8的二進(jìn)制表示為00001000,現(xiàn)在我們運(yùn)算8 - 7,在計(jì)算機(jī)并不是用8減去7,而是用8 + (-7),也就是用00001000加上-7的補(bǔ)碼11111001,兩個(gè)有符號(hào)數(shù)相加,如果符號(hào)位相加有近位就刪去符號(hào)位的進(jìn)位,得到00000001,也就是1.
java中我們經(jīng)常也會(huì)遇到不同數(shù)據(jù)類型的轉(zhuǎn)換,這是最容易出錯(cuò)的地方。
首先我們了解一下什么是符號(hào)擴(kuò)展,對(duì)于正數(shù)來(lái)講,在前面補(bǔ)0; 負(fù)數(shù)時(shí)在前面補(bǔ)1。比如8位的二進(jìn)制數(shù)10000111擴(kuò)展為16位,我們?cè)谇懊婕由?個(gè)1,1111111110000111;如果是正數(shù),則在前面補(bǔ)0。這樣進(jìn)行擴(kuò)展后,符號(hào)和數(shù)值的大小都不變。
接下來(lái)我們我們看一下不同類型之間是怎樣轉(zhuǎn)換的,首先我們要知道這些基本類型各自占幾位。 有符號(hào)型: byte = 8 int = 32 short = 16 long = 64 float = 32 double = 64 *boolean 只占一位,用0和1代表false和true。
無(wú)符號(hào)型: char = 16
1. byte型轉(zhuǎn)為char型 因?yàn)閎yte是有符號(hào)類型,再轉(zhuǎn)成char型時(shí)需要進(jìn)行符號(hào)位擴(kuò)展,如果是正數(shù)就在前面不上8個(gè)0, 如果是負(fù)數(shù)就在前面補(bǔ)上8個(gè)1。例如11111111(0xff)左邊連續(xù)補(bǔ)上8個(gè)1結(jié)果是0xffff。因?yàn)閏har是無(wú)符號(hào)類型,所以0xffff表示的十進(jìn)制數(shù)是65535。
2. char型轉(zhuǎn)為int型 因?yàn)閏har是無(wú)符號(hào)類型,轉(zhuǎn)換成int型時(shí)進(jìn)行在前面補(bǔ)上16個(gè)0,用十進(jìn)制表示結(jié)果為結(jié)果0x0000ffff,對(duì)應(yīng)的十進(jìn)制數(shù)是65535。
3. int型轉(zhuǎn)為byte型 因?yàn)閕nt是32位,而byte類型值只占8位,直接截取最后8位。例如-1的補(bǔ)碼為0xffffffff,轉(zhuǎn)換為byte型后為0xff,值為-1。
總結(jié):如果最初的數(shù)值類型是有符號(hào)的,那么就執(zhí)行符號(hào)擴(kuò)展;如果是char類型,那么不管它要被轉(zhuǎn)換成什么類型,都執(zhí)行零擴(kuò)展。還有另外一條規(guī)則也需要記住,如果目標(biāo)類型的長(zhǎng)度小于源類型的長(zhǎng)度,則直接截取目標(biāo)類型的長(zhǎng)度。例如將int型轉(zhuǎn)換成byte型,直接截取int型的右邊8位。 下載地址 ?
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注