##關於C中的類型轉換程序員
對於C中的類型轉換一直停留在《C和指針》中的那張類型提高表中,其中給出了類型的提高順序,也就是說若是一個表達式中同時出現了int和short,short類型的變量會自動提高爲int。可是對其中的具體原因,歷來沒有去詳細的想過,以前看書比較粗糙,沒有細讀一本書,理解了總體的意思就以爲本身真的理解的做者的意圖,最近在[coursera]上看《[史記]》的開放課程的時候老師講到一個看怎樣讀經書的方法,講到一篇經典的文章的時候,都會去揣測每個字的含義,以及爲何要用這個字而且出如今這個位置。而後本身去翻了一下前人寫的那些個註疏,發現好多的經典咱們都沒有真正的理解其中的含義。指針
言歸正傳,繼續寫個人讀書筆記,當一個無符號類型的值從較小的數據類型轉換爲一個較大的數據類型的時候,高位補零就能夠了,這裏也叫做零擴展(zero extersion)。若是將一個有符號的值從較小類型轉換成較大的類型的時候會發生什麼的?難道也是同樣的嗎?非也,這裏的概念我也是第一次看到,這裏會發生符號擴展(sign extension),也就是說高位補什麼是根據他的最高位決定的。code
##關於類型轉換的一些建議ci
關於類型轉我以爲C++之父的那句話永遠是真理,C風格的隱時類型轉換正的很邪惡,常常會發生一些和你的直覺不相符的事情。這也就是C程序員永遠要考慮的一個問題。下面就是一段很邪惡的代碼。element
3 float sum_elements(float a[], unsigned int length) 4 { 5 float sum = 0.0; 6 7 int i; 8 for(i = 0; i < length-1; i++) 9 sum += a[i]; 10 11 return sum; 12 }
我使用以下的調用會get
17 float s[] = {1,2,3,4}; 18 float result = sum_elements(s, 4); 22 result = sum_elements(s, 0);
你猜會發生什麼?io
qian@qian-vm:~/excise/csap/ch2$ ./a.out <br> result of sum is 6.000000<br> Segmentation fault (core dumped)class
-END [coursera]:http://coursera.org/ "coursera" [史記]:https://class.coursera.org/shiji-002 "史記"讀書筆記