C語言複習(六) 隱式型別轉換相關分析

2021-06-22 10:52:06 字數 1056 閱讀 3237

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協議的部落格又大致看了一遍,然後有把出錯的函式的功能簡單過了一遍。又把除錯資訊列印了一遍。最後基本確定是隱式型別轉換的問題,不需要做什麼大的改動。因為是前人寫的 理解和修改都得小...