。。。
無符號整數的范圍
unsigned short的取值范圍為0~65535。
unsigned short占有2個字節,也就是16位,在計算機內部用(0000 0000 0000 0000)2表示0,用(1111 1111 1111 1111)2表示最大數。
(1)2表示1,(11)2表示3,(111)2表示7……(1111 1111 1111 1111)2表示65535,剛好是21-1、22-1、23-1……216-1,得出無符號整型的計算公式為0~2n-1(n為整型位數)。
補碼
補碼中第一位表示正負數:0表示正數,1表示負數。
補碼原理
要求一個負數的補碼,將它的絕對值二進制按位取反再加1,正數的補碼是自己。
如求4位二進制數-3的補碼:把(3)10=(0011)2按位取反得(1100)2,再加1得(1101)2,short型只是把4位擴展為16位(0000 0000 0000 0011)2,按位取反得(1111 1111 1111 1100)2,加1得(1111 1111 1111 1101)2。
16位二進制數-32768的補碼:將32768轉成二進制得(1000 0000 0000 0000)2,取反得(0111 1111 1111 1111)2,加1得 (1000 0000 0000 0000)2
補碼的特點是可以把減法運算轉換成加法,比如一個4位二進制減法(0011)2-(0001)2在CPU中會先取得(0001)2的補碼(1111)2,將此變成加法運算 (0011)2+(1111)2得到(10010)2,因為運算器只有4個位,前面的1舍去,得到正確結果(0010)2,這樣CPU中就可以省去一個做減法運算的元件。
不同類型的混合運算
※賦值語句中,等號兩邊類型不同時,以左邊類型為准。
如:
int a=300;
char b;
b=a; /*不可預期的錯誤,但系統不會報錯*/
※除法運算時,2/3的結果為0,2.0/3或者2/3.0結果都為0.66666……。這說明如果除號兩邊都是整數,結果只能是整數,除號兩邊有任意一個浮點數,結果就是精確的浮點數。
混合運算時也遵循上述規律:
double d=1.0+2/3;
會先算2/3,這時答案已經是0,再加1.0,得到錯誤的結果1.0,改成
double d=1.0+2/3.0;
結果為1.666666,正確。
※char參與任何運算都會轉換成ASCII碼
※%(取余)不能用在浮點數上,它不會自動將浮點數轉換成整數。
強制轉換
格式:
(類型名)表達式
如:
double d=(double)2/3+1.0;
相當於double d=2.0/3+1.0;
與double d=2/3.0+1.0;運算結果相同