C在以下四種情況下會進行隱式轉換:
1、算術運算式中,低類型能夠轉換爲高類型。
2、賦值表達式中,右邊表達式的值自動隱式轉換爲左邊變量的類型,並賦值給他。
3、函數調用中參數傳遞時,系統隱式地將實參轉換爲形參的類型後,賦給形參。
4、函數有返回值時,系統將隱式地將返回表達式類型轉換爲返回值類型,賦值給調用函數。
2、算數運算的隱式轉換
算數運算中,首先有如下類型轉換規則:
1、字符必須先轉換爲整數(C語言規定字符類型數據和整型數據之間可以通用) 。
2、short型轉換爲int型(同屬於整型) 。
3、float型數據在運算時一律轉換爲雙精度(double)型,以提高運算精度(同屬於實型) 。
其次,有下面的規則。
當不同類型的數據進行操作時,應當首先將其轉換成相同的數據類型,然後進行操作,轉換規則是由低級向高級轉換。轉換規則如下圖所示:
有符號數與無符號數之間運算問題
以下實驗均在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<<a+b<<std::endl;
結果輸出爲4294967186,同樣的道理,在運算之前,a=20,b被轉化爲4294967166,所以a+b=4294967186
減法和乘法的運算結果類似。
如果作爲signed int型數據的b=-130,b與立即數之間操作時不影響b的類型,運算結果仍然爲signed int型:
signed int b=-130;
std::cout<<b+30<<std::endl;
輸出爲-100。
而對於浮點數來說,浮點數(float,double)實際上都是有符號數,unsigned 和signed前綴不能加在float和double之上,當然就不存在有符號數根無符號數之間轉化的問題了。
注:以上運算時的變量類型轉換,都是在將運算後的結果進行的轉換:
unsigned int a=20;
signed int b=-130;
std::cout<<a+b<<std::endl;
結果輸出爲4294967186,同樣的道理,在運算之前,a=20,b被轉化爲4294967166,所以a+b=4294967186
該例中其實先是20 + (-130) = -110後,將-110轉換成unsigned int 類型,其值剛好是4294967186。如果不是這樣子轉換的話下面這段代碼有點解釋不通。
下面例子中當x = 7 和 y = -7傳入時,如果是在運算時轉換的話,那-7肯定會是個很大的正數,所以結果應該返回c = 1而不是 c = 2;只有是在運算後 7 -7 = 0;纔會返回c = 2;
呵呵,這個地方有點小異議,希望高人指點
- #include <iostream>
- /*
- 當表達式中存在符號類型和無符號類型時
- 所有的操作數都自動轉換爲無符號類型
- */
- using namespace std;
- char getChar(int x,int y){
- char c;
- unsigned int a=x;
- unsigned int b=a+y;
- (a+y>10)?(c=1):(c=2);
- return c;
- }
- void main(){
- char c1=getChar(7,4);
- char c2=getChar(7,3);
- char c3=getChar(7,-7);
- char c4=getChar(7,-8);
- printf("c1=%d\n",c1);
- printf("c2=%d\n",c2);
- printf("c3=%d\n",c3);
- printf("c4=%d\n",c4);
- system("pause");
- }
答案: c1 = 1 c2= 2 c3= 2 c4= 1
這樣一個題,據說是微軟面試題:
cout<<i * -1;
參考:
http://blog.csdn.net/miaouu/article/details/5213042
http://blog.csdn.net/ysuncn/article/details/1787189
http://blog.sina.com.cn/s/blog_590be5290100htvu.html