C語言 int 轉 char 隱式轉換 陷阱

2021-08-15 01:13:54 字數 1492 閱讀 3794

今天看**時發現乙個問題, 一時沒看出原因, 問題我提取出來如下:

char c = 0xff;

if (c == 0xff)

else

如果您能準確知道答案, 那麼作為大神本文可能不適合你…

答錯了的朋友, 別灰心, 我們一起來探索原因!

執行結果:

c !=0xff
1.把char的值分別以整數和無符號整數的形式列印出來:

char c = 0xff;

printf("c: d[%d], u[%u]\n", c, c);

執行結果:

c: d

[-1], u

[4294967295]

可以看到, 有符號輸出為-1可以理解, 為什麼無符號輸出是四個位元組?

(4294967295對應十六進製制0xffff ffff)

2.原因, 隱式轉換搞的鬼:

這裡printf %d, %u涉及乙個char轉int: 字元型到整形的轉換, 看printf函式定義:

%d 十進位制整型輸出;

%u 十進位制無符號整型輸出;

而第乙個例子 c == 0xff中, 0xff預設為有符號int型,

由於型別不同, 關係運算子」==」會觸發轉換, 根據隱式轉換規則,

char 同樣會 轉為 int, 且二者均為有符號的;

3.先說結論:

例子中char c = 0xff;

二進位制表示: 1111 1111;

若為有符號, 表示 - 1, 此時轉換為int型後記憶體就變為: 0xffff ffff;

若為無符號, 表示255, 此時轉換為int型後記憶體就變為:0x0000 00ff.

4.再看例子, 你將徹底明白:

char c = 0xff;

int n = c;

intm = (unsigned char)c;

if (n == m)

else

結果為:

n != m

n: d[ -1], u[4294967295], x[ffffffff]

m: d[255], u[ 255], x[000000ff]

本例中的問題, 是由 char == int 時涉及隱式轉換引發的,

建議比較時盡量用相同型別, 如果非要強轉,有兩種方式解決:

1.賦值時定義為unsigned char:

unsigned

char c = 0xff;

if(c == 0xff)//為真

2.比較時截斷int:

char c = 0xff;

if(c == (char)0xff)//為真

如有不足, 望不吝賜教, 謝謝!

c語言中char型別轉int型別

剛才做北郵2010年網研上機題的時候,遇到了char型和int型相互轉化的問題,這裡進行一下總結。今後,可能會多次更新部落格,因為半年做了很多總結,但是都是儲存在word文件上了,現在開始慢慢向csdn部落格轉移。1 char型數字轉換為int型,例如 char a 123 printf d n a...

c語言隱式型別轉換

隱式型別轉換分三種,即算術轉換 賦值轉換和輸出轉換。1 算術轉換 進行算術運算 加 減 乘 除 取餘以及符號運算 時,不同型別數招必須轉換成同 一型別的資料才能運算,算術轉換原則為 整型提公升 對於所有比int小的型別,包括char,signed char,unsigned char,short,u...

C語言隱式型別轉換

隱式型別轉換分三種,即算術轉換 賦值轉換和輸出轉換。1 算術轉換 進行算術運算 加 減 乘 除 取餘以及符號運算 時,不同型別數招必須轉換成同 一型別的資料才能運算,算術轉換原則為 整型提公升 對於所有比int小的型別,包括char,signed char,unsigned char,short,u...