今天看**時發現乙個問題, 一時沒看出原因, 問題我提取出來如下:
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...