c語言中可以做隱式型別轉換,不需要我們明確指明,這點很方便,當有時候也帶來隱性的問題。先看看c語言中隱式型別轉換的規則:
例如:
int i=0;
char c=』a』;
i=c;//這裡的變數c會被轉換成int型別,值為『a』的ascii碼
#include int main()
else
printf("i+j的真實值為:%d!\n",i+j);
return 0;
}
執行結果為:
按照我們正常的計算,結果應該是-1,輸出的應該會是「i+j的值小於0!」,而這裡正好相反,輸出了「i+j的值大於0!」!!這是什麼問題?要說計算出錯,可為什麼最後一句輸出的是正確的值-1呢??
實際上問題出在if判斷語句中的「(i+j)>=0」此句上,按照變數的定義,i為int型變數,j為unsigned int 型別,它們屬於不用型別的值相加,那麼它們相加前就會產生型別轉換,轉換成unsigned int 型別後再相加,i為int型別,且值為-2,那麼在記憶體中表示為-2的補碼:
16進製制形式為:
此時將它轉換成乙個無符號整型,即是無符號的16進製制數:
換成十進位制為:
讓它加1肯定大於0,即是說此時i+j的值被當作乙個無符號整數來看待的,因此才會有大於0的判斷;
那為什麼最後輸出的是正確的值-1呢?
原因出在我們使用了%d這個格式字元,表示以帶符號的十進位制形式輸出整數!
根據以上的分析,-2在記憶體中的補碼應該為:
只是此時把該補碼當作無符號整型來看待,在這個二進位制基礎上加上二進位制的1,結果就成了:
在使用%d格式輸出時,又把它看做有符號的整數,因此結果就成了-1;其實也可以反向來證明,通過計算也能發現,-1的補碼其實也就是:
c語言隱式型別轉換
隱式型別轉換分三種,即算術轉換 賦值轉換和輸出轉換。1 算術轉換 進行算術運算 加 減 乘 除 取餘以及符號運算 時,不同型別數招必須轉換成同 一型別的資料才能運算,算術轉換原則為 整型提公升 對於所有比int小的型別,包括char,signed char,unsigned char,short,u...
C語言隱式型別轉換
隱式型別轉換分三種,即算術轉換 賦值轉換和輸出轉換。1 算術轉換 進行算術運算 加 減 乘 除 取餘以及符號運算 時,不同型別數招必須轉換成同 一型別的資料才能運算,算術轉換原則為 整型提公升 對於所有比int小的型別,包括char,signed char,unsigned char,short,u...
c語言隱式型別轉換 小心!
今天查乙個和rtp協議有關的bug,不是我寫的,如果是我寫很有可能也會犯這個錯誤。為了對應這個問題,我先是把網上關於rtp協議的部落格又大致看了一遍,然後有把出錯的函式的功能簡單過了一遍。又把除錯資訊列印了一遍。最後基本確定是隱式型別轉換的問題,不需要做什麼大的改動。因為是前人寫的 理解和修改都得小...