今天做了幾題關於c語言資料型別轉換的題目,感覺自己是懂非懂,於是決定在研究研究。
若參與運算量的型別不同,則先轉換成同一型別(更高的),然後進行運算。
轉換按資料長度增加的方向進行,以保證精度不降低。如int型和long型運算時,先把int量轉成long型後再進行運算。
a. 若兩種型別的位元組數不同,轉換成位元組數高的型別
b. 若兩種型別的位元組數相同,且一種有符號,一種無符號,則轉換成無符號型別
在賦值運算中,賦值號兩邊量的資料型別不同時,賦值號右邊量的型別將轉換為左邊量的型別。如果右邊量的資料型別長度左邊長時,將丟失一部分資料,這樣會降低精度,丟失的部分按四捨五入向前捨入。
一、我們直接上例題來分析:
①
#include
int main()
結果:
這裡運用到了2.b的規則,將signed int b,在運算是提公升為 unsigned。
b = -10;在計算機中的負數一補碼形式存在,就是0xfffffff6,轉換為unsigned為4294967286,所以a+b = 5 + 4294967286 = 4294967291;除錯也是這個值(結果還有編譯器有關)
② 有定義(tip:潛在的級數公升級,此處按int輸出)
signed
char ch = 127;
printf(「%d」,ch+127);
輸出結果是254;
如果以上改為:
signed
char ch = 127;
ch = ch + 127;
printf("ch = %d\n",ch);
輸出結果是-2;
為什麼是這這樣呢?我們再看乙個例題:
根據②③來兩個例子,在說明之前強調一點:printf函式中,指定的輸出型別和輸出表列的型別如果不一致,能通過編譯,但是不能正確輸出結果。它們運用的規則為1和3,
1. 若參與運算量的型別不同,則先轉換成同一型別(更高的),然後進行運算。
3. 在賦值運算中,賦值號兩邊量的資料型別不同時,賦值號右邊量的型別將轉換為左邊量的型別。如果右邊量的資料型別長度左邊長時,將丟失一部分資料,這樣會降低精度,丟失的部分按四捨五入向前捨入。
ch = ch + 127; 和i = i + j;
首先存在不同型別的運算,ch + 127; i + j;根據1規則,會提公升型別,ch + 127變為int型別,i+j變為double(j為float,i為int,它們最終都會提公升為double型別),然後就是不型別的賦值,運用到3規則,ch = ch + 127;(int — >char),i = i + j;(double—>int)然後結合例題③**得注釋去理解。
總結:存在不同型別運算,轉換為相同型別(更高的)去運算,這個表示式變成這個更高的型別。並沒有真正去改變變數的型別。當混合運算表示式賦值給某個變數時,如果表示式型別和變數型別不一致,表示式型別需要轉換為變數型別( 在賦值運算中,賦值號兩邊量的資料型別不同時,賦值號右邊量的型別將轉換為左邊量的型別。如果右邊量的資料型別長度左邊長時,將丟失一部分資料,這樣會降低精度,丟失的部分按四捨五入向前捨入。)
關於C語言型別轉換情況
在c語言中,資料型別指的是用於宣告不同型別的變數或函式的乙個廣泛的系統,我們常用的算術型別包括兩種型別 整數型別和浮點型別。那麼相互之間具體是怎麼轉化的呢?了解一下型別轉換 不同資料型別的儲存大小和值範圍是不一樣的,程式在初始化的時候就已經設定了,例如 int a 9 float b 8.5 a,b...
關於C語言的隱式型別轉換
這個問題,本來以為自己早已爛熟於胸了,但是乙個測試程式還是把我給放倒了。首先給出以下c語言預設的隱式轉換規則 char,short int unsigned long double float ok,這裡看起來好像也完全沒問題。我們接下來看乙個簡單的小示例 include int main retu...
關於C語言的宣告而型別轉換
最近遇到一些總是讓人覺得奇怪的事情,例如,有個同學問我乙個c語句 void 0 這個語句的功能?有點令人無語,呵呵。從學習c語言以來都沒有遇到這樣的的語句。不過,直覺告訴我,這個東西一定非常有意思。研究了一些時間,知道這個是用來模擬開機時設計的乙個c語句宣告,計算啟動時,從位址為0開始呼叫這個函式。...