今天一開啟部落格,看到左上角的園齡5年,目光有些恍然,昔日作為學生上課的情景、已經慢慢變的模糊。是啊、畢業已經3年有餘,時光不再來...
一、原碼和補碼
在步入正文說型別轉換之前,先做乙個小鋪墊,了解一下原碼和補碼。
[注:由於同乙個數字在用不同位數的原碼或補碼表示時、結果不同,所以如無特殊說明、該小節下出現的所有原碼和補碼均為8位]
原碼(true form)是一種計算機中對數字的二進位制定點表示方法。原碼表示法在數值前面增加了一位符號位(即最高位為符號位):
正數該位為0,負數該位為1(0有兩種表示:+0和-0),其餘位表示數值的大小。
1、原碼優點:簡單直觀;例如,我們用8位二進位制表示乙個數,+11的原碼為00001011,-11的原碼就是10001011
2、原碼缺點:原碼不能直接參加運算,可能會出錯。例如數學上,1+(-1)=0,而在二進位制中 00000001+10000001=
10000010,換算成十進位制為-2。顯然出錯了。
補碼(two's complement) 在計算機系統中,數值一律用補碼來表示和儲存。補碼是可以直接參與運算的。原碼和補碼表示方法均有
符號位和數值位兩部分,符號位都是用0表示「正」,用1表示「負」,而數值位表示方法不相。
1、知原碼求補碼
求正數的補碼:正整數的補碼與原碼相同。
【例】+9的補碼是00001001。
求負數的補碼:求負整數的補碼, 在原碼的基礎之上 符號位不變,數值位各位取反,最後整個數加1。
【例】求-5的補碼。
-5的原碼(10000101)→符號位不變(10000101)→數值位取反(11111010)→加1(11111011)
所以-5的補碼是11111011。
【例】數0的補碼表示是唯一的。
[+0]補=[+0]原=00000000
[-0]補=11111111+1=00000000
2、知補碼求原碼
已知乙個數的補碼,求原碼的操作其實就是對該補碼再求補碼:
1)如果補碼的符號位為「0」,表示是乙個正數,其原碼就是補碼。
2)如果補碼的符號位為「1」,表示是乙個負數,那麼求給定的這個補碼的補碼就是要求的原碼。
【例】已知乙個補碼為11111001,則原碼是10000111(-7)。
因為符號位為「1」,表示是乙個負數,所以該位不變,仍為「1」。
其餘七位1111001取反後為0000110;
再加1,所以是10000111。
3、補碼的運算
補碼:
二、整形間的型別轉換
根據上述的8個例子可以得出如下結果:
1、補位式轉化、即少位資料型別向多位資料型別轉化(例1、例2、例3、例4)三、整形與浮點型間的型別轉換有了上面的基礎、再理解整形與浮點型的轉換就容易多了。所補位與運算元的資料型別有關,與目標資料型別無關。
如果運算元是有符號的資料型別,所補位一律為運算元的符號位,如果運算元是無符號的資料型別,所補位一律為0。
2、截位式轉化、即多位資料型別向少位資料型別轉化(例5、例6)
該轉換方式就是簡單的擷取有效數字(即丟棄高位),和運算元的型別無關。
3、轉換符號位式轉化、即相同位數有無符號資料型別間的轉化(例7、例8)
發生該型別轉化時,只是最高位的意義發生了變化,進而可能導致結果改變。
由整形向浮點型轉換的時候,如果整形資料的值過大或過小,就可能損失一些最低的有效位,造成精度損失(float的精度只有7位,double15~16位)。
基本型別轉換
1 整型預設int byte a 1 short b 2 int c 3 long d 4 高位元組轉低位元組,低位元組 裝不下 強轉!byte aa byte b short bb short c int cc int d 低位元組轉高位元組,高位元組 裝得下 自轉!long d1 c int c...
基本型別轉換
object 是最終基類,任何形式值都可以轉化成 object形式。基本型別轉換 強制 顯示 轉換和自動 隱式 轉換!裝箱轉換 允許值型別隱式轉化為引用型別 是 強制轉換!轉換方法 1,用 此類是同類之間轉換,內是轉換之後的 資料型別!例如,int i 0 double d 1.23 i int d...
Java基本型別的型別轉換
語法格式 targettype value,其運算子是圓括號。當進行強制型別轉換時,類似於把乙個大瓶子中的水倒入小瓶子中,如果大瓶子中水不多還好,如果大瓶子中水多,將會引起溢位,從而造成資料損失 注 正數在計算機中以原碼存放,負數在計算機中以補碼顯示 float a 5.6 上面一行 會報錯,因為計...