首先,我們必須得知道:
不同型別資料進行混合運算時,編譯器會自動進行型別轉換。即:混合運算時資料型別的轉換——隱含轉換
一些二元運算子(算術運算子、關係運算子、邏輯運算子、位運算子和賦值運算子)要求兩個運算元的型別一致。
在算術運算和關係運算中如果參與運算的運算元型別不一致,編譯系統會自動對資料進行轉換(即隱含轉換),
基本原則是將低型別資料轉換為高型別資料。
當參與運算的運算元必須是bool型時,如果運算元是其它型別,編譯系統會自動將非0資料轉換為true,0轉換為false。
位運算的運算元必須是整數,當二元位運算的運算元是不同型別的整數時,也會自動進行型別轉換,
賦值運算要求左值與右值的型別相同,若型別不同,編譯系統會自動將右值轉換為左值的型別。
順便說一下運算子的優先順序:
以下內容**
cout<-2)
以下實驗均在virual c++6中執行通過
這個問題測試是否懂得c語言中的整數自動轉換原則,有些開發者懂得極少這些東西。當表示式中存在有符號型別和無符號型別時所有的運算元都自動轉換為無符號型別。因此,從這個意義上講,無符號數的運算優先順序要高於有符號數,這一點對於應當頻繁用到無符號資料型別的嵌入式系統來說是丰常重要的。
首先進行乙個實驗,分別定義乙個signed int型資料和unsigned int型資料,然後進行大小比較:
unsigned int a=20;
signed int b=-130;
a>b?還是b>a?實驗證明b>a,也就是說-130>20,為什麼會出現這樣的結果呢?
這是因為在c語言操作中,如果遇到無符號數與有符號數之間的操作,編譯器會自動轉化為無符號數來進行處理,因此a=20,b=4294967166,這樣比較下去當然b>a了。
再舉乙個例子:
unsigned int a=20;
signed int b=-130;
std::cout<
減法和乘法的運算結果類似。
如果作為signed int型資料的b=-130,b與立即數之間操作時不影響b的型別,運算結果仍然為signed int型:
signed int b=-130;
std::cout<
而對於浮點數來說,浮點數(float,double)實際上都是有符號數,unsigned 和signed字首不能加在float和double之上,當然就不存在有符號數根無符號數之間轉化的問題了。
無符號數與有符號數比較
2012 04 24 19 30 2555人閱讀收藏 舉報擴充套件 先出幾個題目,再解釋一下為什麼答案是那樣的。題目一 int a 1 unsigned int b 1 printf d a b 結果輸出 1 因為無符號數與有符號數比較時,要將有符號數轉化為無符號數,再來比較。a轉化為無符號數後就是...
無符號數與有符號數比較
1轉化為無符號數 65535 在計算機中負數是用補碼表示的,即反碼加1 正數直接用原碼表示 因為 1是負數就用補碼表示為 00000000 00000001 的反碼 11111111 11111110 1 即 11111111 11111111 轉換為十進位制數為65535 最高位為符號位不必考慮 ...
有符號數和無符號數
有符號和無符號整數 1.通常情況下,大多數字預設的是有符號數,比如 4,5 要想寫乙個無符號數必須在後面加u 比如 4u,5u 2.在計算機中有符號數是用補碼的形式來表示的,最高位是符號位。無符號數就是正數唄 正數的補碼和原碼相同。比如 1 在計算機中表示為 11111111 11111111 11...