關於c語言型別擴充套件的問題,經常被大家忽略,因為這是乙個很隱秘的問題,請看下文:
void func(void)
int i=1;
unsigned char c1 = 1;
signed char c2 = -1;
if(c2 > i)
dprintf("\r\n -1 > 1");
else
dprintf("\r\n -1 <= 1");
if(c2 > c1)
dprintf("\r\n -1 > 1");
else
dprintf("\r\n -1 <= 1");
實際執行結果會是多少呢?
-1 > 1
-1 > 1
這是問什麼呢? 很明顯-1<1, 難道是列印有問題嗎?還是這是c的乙個bug? 其實這是自己留下的乙個隱患。
謹記:在c語言中,當兩種不同型別之間運算時,低位元組長度型別會向高自己長度型別轉換,有符號會向無符號型別轉換。
拿上例來說,當c2與i進行比較時,由於c2是有符號8位,i是無符號32位(int長度與機器型別有關,在32位機器中,int表示為32位),根據c語言的規則,c2被轉換成32位,即-1的補碼,故會得出-1>1的結論。
而後面乙個-1<1的情況就不用說了嗎?根據c規則,c2轉化成無符號8位整數,即255,255當然大於1了,所以大家就會明白為什麼-1>1了吧!(注:列印出的資訊並沒有錯,雖然完全誤導了程式設計師,但是這些都是因為自己給自己留下來的隱患)。
看了這篇文章之後,以後再編寫程式時我們是否都應該多留乙個心眼呢? 哈哈
(現從事led行業,專注於戶外大型led顯示屏控制系統的研發,希望與大家一起交流,共同進步)
C 語言的資料型別寬度擴充套件
編譯執行環境 windows 64bits vs2017 debug win32 在程式設計或者面試過程中,關於資料型別寬度的擴充套件,可能會遇到如下問題 char c 128 printf d c 輸出 128為什麼乙個正整數 128 以整型 int 輸出時變成了乙個負數?在理解上面的問題時,我們...
關於C語言struct的特殊擴充套件技巧
unix linux程式設計實踐教程 中p69頁,有寫道,dirent結構中成員d name用於存放檔名。注意在此系統中d name被定義為只有乙個元素的陣列,這是如何做到的能?因為乙個自負的空間只能存放字串的結束字元。p92也詢問,在struct dirent中,陣列d name的長度在有的系統上...
C語言基本型別及擴充套件
c語言基本型別修飾符 signed unsigned long short 當只使用乙個型別修飾符時 當它不被放在基本型別前時 我們就假定為int。因此,下面的型別修飾符是等價的 signed signed int unsigned unsigned int long long int short ...