類型轉換
- 1.類型轉換
- 1.1隱式轉換
- 1.2常用算術轉換
- 1.2強制類型轉換
1.類型轉換
在執行算數運算時,計算機比C語言的限制更多。為了讓計算機執行算術運算,通常要求操作數用相同的大小(即為的數量相同),但是C語言卻允許混合使用基本類型。在這過程是由于編譯器會自動進行隱形轉換,當然C語言也允許程序員使用強制運算符執行顯示轉換。
首先討論隱式轉換
1.1隱式轉換
解釋最常用的算術轉換
1.2常用算術轉換
算數轉換多用于二元運算符的操作數上,算數轉換是為了能安全地使用兩個操作數我們需要相應的數據類型。也就是往往我們進行提升,通俗來說就是一個存儲字節大的類型和一個存儲字節小的類型,我們傾向與使用都使用存儲字節大的類型
最常用的就是整形提升
表達式的整型運算要在CPU的相應運算器件內執?,CPU內整型運算器(ALU)的操作數的字節?度?
般就是int的字節?度,同時也是CPU的通?寄存器的?度。因此,即使兩個char類型的相加,在CPU執?時實際上也要先轉換為CPU內整型操作數的標準?度。
執行常用算術轉換的規則可以劃分成兩種情況
- 任意操作數的類型是浮點型的情況。
按照float->double->long double,倘若涵蓋了混合整數和浮點數類型的情況,那便將整形轉換成浮點型
這就是為什么double sun=1.0/2等于0.000000
因為默認所給數為整形,1和2都是整形執行除法得到整形0隱性轉換成double類型(默認保留六位小數)為0.000000
而double sum=1.0/2,1.0默認為double類型而2默認為整形,提升整形2被隱性轉化為double類型,此時執行的就是為什么除法僅僅要求一個數為浮點數因為另一個操作數會提升 - 兩個操作數的類型都不是浮點型的情況
int->unsigned int->long int->unsigned long int
盡管提升方便了我們的計算,但也會導致某些隱蔽的編程錯誤
假設 int a=-10 unsigned int b=10
if(b>a),我們期望該條件為真。但由于提升我們會將有符號數int轉換為無符號數unsigned int也就是說我們會把符號位1當成數來表示,因此a會變成一個極大數此時條件為假
1.2強制類型轉換
(類型名)表達式