c語言中有以下四種情況會進行隱式轉換:
1、算術運算子中,低型別轉換為高型別。
2、賦值表示式中,右邊表示式的值自動隱式轉換為左邊變數的型別,並賦值。
3、函式呼叫傳遞引數時,系統將實參轉換為形參的型別後,賦給形參。
4、函式有返回值是,系統將表達值型別轉換為返回值型別。
進行算術運算時,不同型別的數必須轉換成同一型別的資料才能進行運算,在轉換時依照低階型別向高階型別轉換,其轉換型別高低階如圖所示:
在運算的時候,以表示式中最長型別為主,其他型別均往該型別轉換,如:
(1)如果運算中有double或者float型的,則其他的型別均轉換成double型別進行運算;
(2)如果運算中最長型別為int,那麼char也將轉換為int進行運算。
ps:算術轉換是在運算過程中自動完成的;
包含long與unsigned int,在32位環境中都是4位元組,所以均轉換為unsigned long。
包含signed int和unsigned int,signed會轉換為unsigned,如果int恰好為負數,那麼在運算時通過取補碼相加的方式運算,結果可能就是乙個很大的數了,現在我們通過以下兩個**來給大家講一下:
(1)如果int為正數,與無符號進行運算,直接取所需位數的原碼即可。例如:
#include
#include
int main()
該程式的執行結果為44、255,說到這裡,可能就覺得有些迷惑了,這是為什麼?那麼我們用兩個圖來大家說明一下:
從圖上可以看出,int佔位比char多,所以取後8位(因為char佔8位),輸出來就是44,其實就是a(300)對256取模後的值。
(2)如果int為負數,則先取int的補碼,再進行上述計算,例如上面**中的b,如圖所示:
如圖所示,取-1的補碼,然後和(1)中一樣,所以輸出值為255
很明顯,當大於或等於時,無需擷取某一段,直接進行運算就可以,但是同樣的,對負數來說,也是要先取補碼,再運算,比如下面**:
#include
int main()
這段**在32位環境中執行結果為-1,64位環境中執行結果為4294967295
至於說為什麼,也是和上面的一樣,-3是乙個很小的值,但是當與unsigned型別進行運算的時候,-3先取補碼,我們就可以發現,其補碼為1111….11100,就成為了乙個很大的數,再與2運算,結果就是2^32-1,是乙個很大的數,超出了long的最大範圍,所以顯示為-1,至於4294967295,就是這個真正的值了。
說到這裡,就要將將,我們怎麼解決這個問題呢?因為我們知道雖然int、long、unsigned int都是4位元組大小,但是int和long真正的儲存資料的只有31位,第一位是符號位,導致其範圍為2^31-1,而unsigned int沒有符號位。
第一種方法:printf(「%lu\n」, a + b);即可輸出正常的值;
第二種方法:定義c為long long,用%lld輸出也可以,因為long long佔8個位元組,完全可以放得下。
ps:即使運算元中只有char、short,也是先轉換為int進行計算
在賦值時,賦值運算子右邊的型別必須轉換為左邊的型別,如果右邊的型別長度大於左邊,則要進行擷取的操作。
以以下例子做說明:
int main()
因為char的範圍為0-255,且 i 的長度是大於char的,所以在賦值後,會對 i 進行擷取,所以最後輸出結果就是1,也很容易計算,當 i>255,則對256取模就是最後的結果。
在使用printf按制定格式輸出的時候,當輸出的型別和輸出格式不符合的時候,就會進行型別轉換。例如:用long輸出%d,則相當於將long轉換為int輸出;將int用%c輸出,相當於將int轉換為char再輸出。用以下兩個例子說明:
int main()
int main()
答案是14464 -32767,為什麼和上乙個直接取模不一樣呢?那是因為char是無符號的,而%hd(short)是有符號的,所以:
在取80000時,看注釋,取後面16位,首位為0,是正數,直接就是結果:14464;
而取32769的時候,首位為1,是負數,所以取其補碼,結果就是-32767。
其實我們也可以從取模的角度來思考,當超過32767,由於short的取值範圍是 -32767—32767,所以,又從負數開始取到正數,再如此迴圈,因此我們會看到當long的值不斷增大,輸出結果呈現的是正負不斷交替的。
int fun(double n)
int main()
結果當然就是5啦,其他的比如int到short,負數的結果什麼的,就交給大家自己去實驗了,只要明白了他的原理,無論何時都夠很輕易地分析出來的。最後,給一張彙總圖了斷,哈哈哈哈哈
隱式型別轉換
c 本身對內建型別定義了各種隱式的型別轉換,這種內建的型別轉換在可能導致精度 丟失的情況下編譯器會發出警告,但當我們定義自己的型別時,提供各種隱式轉換往往 是弊大於利的 至少在我編寫過的 中很少用到 隱式的型別轉換可分為 其它型別到本型別,本型別到其它型別兩種.第一種通過單變數 可呼叫之建構函式進行...
隱式型別轉換
1.c的整型算數運算總是至少以預設型型別的精度來進行的。為了獲得這個精度,表示式的字元和短整型運算元在使用之前被轉換為普通整型,這種轉換叫 整型提公升 下面我們來看個例子 char a 2 char b 127 char c a b 求c 多少?首先char為1個位元組 而且是有符號的 char最大...
隱式型別轉換
double float 高 long unsigned int char,short 低 1.如乙個int 型資料與乙個unsigned型資料一起運算,需要先將int型資料轉換為unsigned型,然後兩者再進行運算,結果為unsigned型。所有這些轉換都是由系統自動轉換 2.乙個大於0x80的...