C語言隱式型別轉換

2021-08-03 09:05:08 字數 1768 閱讀 6935

隱式型別轉換分三種,即算術轉換、賦值轉換和輸出轉換。

1.算術轉換

進行算術運算(加、減、乘、除、取餘以及符號運算)時,不同型別數招必須轉換成同 一型別的資料才能運算,算術轉換原則為:

整型提公升:對於所有比int小的型別,包括char, signed char, unsigned char, short, unsigned short,首先會提公升為int型別。

在進行運算時,以表示式中最長型別為主,將其他型別位據均轉換成該型別,如:

(1)若運算數中有double型或float型,則其他型別資料均轉換成double型別進行運算。

(2)若運算數中最長的型別為long型.則其他型別數均轉換成long型數。

(3)若運算數中最長型別為int型,則char型也轉換成int型進行運算。算術轉換是在運算過程中自動完成的。

特別注意的是有符號和無符號之間的轉換:

包含long與unsigned int,32位機器上都是4位元組,所以均轉換為unsigned long.

包含signed與unsigned int,signed會轉換為unsigned。如果int恰好為負數,其結果為對unsigned取值個數求模的結果。比如將-1賦給8位的unsigned char,呢麼結果就是255(-1對256取模後的值)。unsigned char取值範圍0~255。

注意:在進行自動型別轉換的時候,如果原來的數是無符號數,那麼在擴充套件的時候,高位填充的是0;如果是有符號數,那麼高位填充的時符號位!

2.賦值轉換

進行賦值操作時,賦值運算子右邊的資料型別必須轉換成賦值號左邊的型別,若右邊的資料型別的長度大於左邊,則要進行截斷或捨入操作。

下面用一例項說明:

char ch;

int i,result;

float f;

double d;

result=ch/i+(f*d-i);

(1)首先計算 ch/i,ch → int型,ch/i → int型。

(2)接著計算 f*d-i,由於最長型為double型,故f→double型,i→double型,f*d-i→double型。

(3)(ch/i) 和(f*d-i)進行加運算,由於f*d-i為double型,故ch/i→double型,ch/i+(f*d-i)→double型。

(4)由於result為int型,故ch/i+(f*d-i)→double→int,即進行截斷與捨入,最後取值為整型。

3.輸出轉換

在程式中將資料用printf函式以指定格式輸出時,當要輸出的鹽據型別與輸出格式不符時,便自動進行型別轉換,如乙個long型資料用整型格式(%d)輸出時,則相當於將long型轉換成整型(int)資料輸出;乙個字元(char)型資料用整型格式輸出時,相當於將char型轉 換成int型輸出。

注意:較長型資料轉換成短型資料輸出時,其值不能超出短型資料允許的值範圍,否則 轉換時將出錯。如:

long a=80000;

printf("%d",a);

執行結果為14464,因為int型允許的最大值為32767,80000超出此值,故結果取以32768為模的餘數,即進行如下取餘運算:

(80000-32768)-32768=14464;

輸出的資料型別與輸出格式不符時常常發生錯誤,如:

int d=9;

printf("%f",d); 或

float c=3.2;

printf("%d",c);

將產生錯誤的結果。

c語言隱式型別轉換

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

c語言隱式型別轉換 小心!

今天查乙個和rtp協議有關的bug,不是我寫的,如果是我寫很有可能也會犯這個錯誤。為了對應這個問題,我先是把網上關於rtp協議的部落格又大致看了一遍,然後有把出錯的函式的功能簡單過了一遍。又把除錯資訊列印了一遍。最後基本確定是隱式型別轉換的問題,不需要做什麼大的改動。因為是前人寫的 理解和修改都得小...

C 隱式型別轉換

c 定義了一組內建型別物件之間的轉換標準,在必要時它們被編譯器隱式的應用到物件上。發生隱式型別轉換的情景 1,在混合型別的算術表示式中 轉換原則 轉換為最寬的資料型別。也可叫,算術轉換。int ival 5 double dval 3.14 ival 被提公升為double型別 ival dval ...