型別轉換通常存在於任意兩個算數型別中,當必要時,編譯器隱式地執行它們,如果新型別能夠表示它,此種轉換將保護它的值,這通常也並不絕對,例如,當你將乙個負數轉換為無符號型別,或將乙個浮點數的小數部分由
double
轉換為int
時,新型別不能表示原來的值,在這種情況下,編譯器會產生乙個告警。
4.1.1
型別的層次
當算術運算元具有不同的型別時,隱式型別轉換由型別的層次來決定,型別的層次依據下列規則:
l任意兩個無符號整數型別具有不同的轉換等級,如果乙個比另乙個寬,它將具有較高等級;
l每乙個有符號整數型別具有與相應的無符號整數型別相同的轉換等級,
char
、signed char
和unsigned char
具有相同的轉換等級;
l標準的整數型別等級排列如下:
_bool < char < short < int < long < long long
l任意標準整數型別具有比同樣寬度的擴充套件整數型別較高的等級;
l每乙個列舉型別具有與相應的整數型別相同的等級;
l浮點型別以下下順序排列:
float < double < long double l
等級最低的浮點型
float
的等級高於任何整數型別;
l每乙個複數浮點型別具有與其實數型別和虛數型別相同的等級。
4.1.2
整數提公升
在任何表示式中,你通常可以使用乙個其型別等級低於
int的值來替代
int
或unsigned int
型別運算元,你也可以將位域當做整數型別運算元來使用,在這種情況下,編譯器使用整數提公升,任何型別級別低於
int的半自動被轉換為
int型別,倘若
int型別能夠表示所有運算元原來的型別;如果
int不足以表達,運算元會被轉換為
unsigned int
。整數提公升通常保護運算元的值,一些例子如下:
char c = 『?』;
unsigned short var = 100;
if (c < 『a』)
//the character constant 『a』 has type int; the value
//of c is implicitly promoted to int for the comparison.
var = var + 1;
//before the addition, the value of var is promoted to int
// or unsigned int.
在最後這個語句中,在執行加法操作前,編譯器將第乙個加數的型別提公升為
int或
unsigned int
,如果int
和short
具有相同的寬度,就像在
16位機器上,這時,帶符號的
int型別沒有足夠的寬度來表示
unsigned short
型別var
的所有值,此種場景下,變數的值被提公升為
unsigned int
,在加法執行以後,結果轉換為
unsigned short
。
C核心技術手冊(二十)
在c 中,常量是表示乙個固定值的記號,它可能是整型 浮點型 字元 或乙個串。乙個常量的型別由它的值和記法來決定。這裡討論的常與混合常量不同,混合常量在c99 標準中介紹,它通常是可修改的物件,類似於變數,了解混合常量的詳細介紹和特殊操作可參見第五章。乙個整型常量可以以普通的十進位制數表示,或者是八進...
C核心技術手冊(二十四)
在 c中,不同型別的操作可以化合成乙個操作,例如,下面的表述式 double dvar 2.5 define dvar as a variable of type double.dvar 3 multiply dvar by an integer constant.if dvar 10l compa...
C核心技術手冊(二十七)
4.1.5 算術型別轉換結果 由於不同的型別有不同的目的 特性和侷限性,將乙個型別轉換為另一型別通常要處理這些差異,通常,乙個型別轉換後的值取決於目標型別的特性。4.1.5.1 bool 型別轉換 任何標量型別可被轉換為 bool,結果為0i.e.當標量值為 o時,使用 false 當標量值為 1時...