“知道做不到就是不知道”
?一、類型轉換
1.自動類型轉換:當運算符(常見+、-、*、/、%)兩邊出現不一致的類型時,編譯器會自動轉換成較大的(范圍更大)類型。
從小到大:char-short-int-long-long long; int-float-double(整型轉換成浮點型)
2.但是特別的對于“printf ”,任何小于int的類型都會被轉換成int;float會被轉換成double。但是“scanf ”卻不會,需要嚴格的格式字符串。如果要輸入short,就需要%hd(因為需要明確的在內存中的大小,便于分配空間)。
3.強制類型轉換
(1)格式:“(類型)值”。
int a;
a=(double)2.0;
(2)注意安全性:大的不要轉換成小的!(防止在內存中溢出,損失精度)
通常是轉換成較大的類型時使用.
4.強制類型轉換的優先級比四則運算還高!!
二、浮點數(float&double)
1. 浮點范圍
(1)inf——表示超過規定范圍的浮點數:表示無窮【+無窮 &-無窮】
(2)nan——表示不存在的浮點數,比如說0/0
2. 精度浮點數
(1)float類型只有7位有效數字,在不規定小數位數的情況下,它的精度是不太準確的。
(2)從鍵盤輸入的帶有小數點的字面量編譯器是默認double類型,而不是float類型。如果一定要要用float類型的數據,所就要用f、F作為后綴來表明數據類型。
現在編程大多數人都會選擇用double,而不是float。因為double精度更高,不容易出現錯誤。之所以會有float存在是因為以前的計算機內存都比較小,程序員都會盡可能的節省空間。現在的計算機內存都相當大,所以內存空間這個基本不成問題!
*這里突然想到之前在講變量的時候遺忘了一點,補充一下:打開界面后,編寫代碼的過程中定義的所有變量、結構等等都是臨時存儲在內存空間里面的,一旦關閉程序,內存空間就會被被釋放。
(3)兩個浮點數,如果直接用==來判斷是可能失敗的,要用fabs(F1-F2)<1e-12/1e-8;
fabs()是<math.h>里的函數,表示求取誤差的絕對值。
1e-12用于表示比較的精度,精確到小數點后幾位。
(4)最好不要在做計算的時候多次使用浮點型數據,它的誤差會不斷的累加。最好的辦法就是通過倍率,化為整型變量。比如說1.23元,就將其表示為123分,以減少計算誤差。
(5)浮點數的內部表達:
(6)選擇浮點類型:沒有特殊要求,盡量只使用double。(甚至還有long double)
3. 浮點類型
(1)在靠近0的附近很小一片區域(想象無限靠近),使用float和double都無法表示;但是0和無窮大還是可以表示。
(2)輸入和輸出:%f就是正常輸出;%e或者%E會輸出科學計數法形式的數據。
(3)對于浮點型的數據,在計算機的內存里面只保留有固定的某些數據,在相鄰的兩個數據之間有無窮多個數,在使用計算機輸入或者輸出數據的時候,就找相鄰最接近的數來表示。
比如說,我本意想要輸出的數據是0.0048,但是計算機內存里面只有0.004和0.005,那么就用0.005來近似表達0.0048。這也可以合理的解釋為什么double的精度會比float高——在內存中,相鄰兩個數之間的距離,double小于float,能精確表示的范圍更大。
寫在最后:
更新C語言學習筆記
如有錯誤,煩請多多批評指正!