原創 關於C語言型別擴充套件的隱患

2021-09-08 00:11:54 字數 888 閱讀 5729

關於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顯示屏控制系統的研發,希望與大家一起交流,共同進步)

[email protected]

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 ...