- 論壇徽章:
- 0
|
數(shù)據(jù)類型的轉(zhuǎn)換分兩種:自動(dòng)轉(zhuǎn)換和強(qiáng)制轉(zhuǎn)換。
1.自動(dòng)轉(zhuǎn)換
自動(dòng)轉(zhuǎn)換用于短字節(jié)的數(shù)據(jù)類型轉(zhuǎn)換為長字節(jié)的數(shù)據(jù)類型,一般情況下,自動(dòng)轉(zhuǎn)換都不會改變數(shù)據(jù)的大小。
eg:byte a;
int x=a;
若 a=101 為正數(shù),首先,寫出它的補(bǔ)碼01100101(整型數(shù)據(jù)在機(jī)器中以補(bǔ)碼形式存儲),然后在補(bǔ)碼的前面補(bǔ)24個(gè)0,直到補(bǔ)齊4個(gè)字節(jié),然后,再轉(zhuǎn)換成原碼(其實(shí)此處原碼和補(bǔ)碼相同)并讀數(shù);
若 a=-101 為負(fù)數(shù),寫出它的補(bǔ)碼10011011,然后在補(bǔ)碼的前面補(bǔ)24個(gè)1,直到補(bǔ)齊4個(gè)字節(jié),然后,再轉(zhuǎn)換成原碼10000000 00000000 00000000 01100101(第一位不變)并讀數(shù)。
2.強(qiáng)制轉(zhuǎn)換
強(qiáng)制轉(zhuǎn)換用于長字節(jié)的數(shù)據(jù)類型轉(zhuǎn)換為短字節(jié)的數(shù)據(jù)類型,而且,不僅可能丟失數(shù)據(jù)的精度,還可能改變數(shù)據(jù)的大小以及正負(fù)號。
eg:int a;
byte x=(byte)a;
(int型的數(shù)據(jù)有4個(gè)字節(jié),只有第一位為符號位,而byte型的數(shù)據(jù)只有一個(gè)字節(jié),所以只取最后一個(gè)字節(jié)。)
若 a=130 為正數(shù),首先,寫出它的補(bǔ)碼00000000 00000000 00000000 10000010,r=(10000010)=130,但是byte型的數(shù)據(jù)取值范圍是[-128,127];所以 r-M =-126在范圍內(nèi),其中M=128+127+1,然后再將-126轉(zhuǎn)換成二進(jìn)制形式的,既是x;
若 a=-130 為正數(shù),寫出它的原碼10000000 00000000 00000000 10000010,再轉(zhuǎn)換成補(bǔ)碼11111111 11111111 11111111 01111110,r=(01111110)=126,在范圍內(nèi),此時(shí) r 既是 x。
小結(jié):長字節(jié)的數(shù)據(jù)類型轉(zhuǎn)換為短字節(jié)的數(shù)據(jù)類型時(shí),取的是靠后的字節(jié)。
先將數(shù)據(jù)寫成補(bǔ)碼形式的,然后取對應(yīng)的字節(jié)并計(jì)算成十進(jìn)制形式的r(注意:此時(shí)把對應(yīng)的字節(jié)看成純二進(jìn)制形式的,而不考慮它的符號),再考慮r的范圍,若不在其數(shù)據(jù)類型的范圍內(nèi),則數(shù)據(jù)類型范圍[-L,R],其模為 M=L+R+1 ,如果r大于R,則模運(yùn)算就會不斷從r中減去M,直至r落在[-L,R]內(nèi),如果一個(gè)運(yùn)算結(jié)果r
小于-L,則模運(yùn)算就會不斷在r中加上M,直至r落在[-L,R]內(nèi)。此時(shí) r 既是 x,若再想轉(zhuǎn)換成二進(jìn)制形式的,此時(shí)需考慮符號。
本文來自ChinaUnix博客,如果查看原文請點(diǎn):http://blog.chinaunix.net/u2/77840/showart_1276289.html |
|