c語言小白基礎(chǔ)學(xué)習(xí)--數(shù)據(jù)類型轉(zhuǎn)換阳柔!在給大家分享這個文章之前蛮浑,小編推薦大家加一下這個裙:六六六二九五四九八 邀請編碼【凌云】大家遇到啥問題都會在里面交流刮刑!而且文件里有各種資源味赃,是個非常好的學(xué)習(xí)交流地方!也有程序員大神給大家熱心解答各種問題乾胶!很快滿員了善已。欲進從速哦鹏氧!等大家加入C/C++學(xué)習(xí)基地哦
在執(zhí)行算術(shù)運算時飒筑,計算機比C語言的限制更多。為了讓計算機執(zhí)行算術(shù)運算绽昏,通常要求操作數(shù)有相同的大行拧(即位的數(shù)
量相同),并且要求存儲的方式也相同全谤。計算機可能可以直接將兩個16位整數(shù)相加肤晓,但是不能直接將16位整數(shù)和32位整數(shù)相
加,也不能直接將32位整數(shù)和32位浮點數(shù)相加认然。另一方面补憾,C語言允許在表達式中混合使用基本數(shù)據(jù)類型。在單獨一個表達式
中可以組合整數(shù)卷员、浮點數(shù)盈匾,甚至是字符。當然毕骡,在這種情況下C語言編譯器可能需要生成一些指令將某些操作數(shù)轉(zhuǎn)換成不同類
型削饵,使得硬件可以對表達式進行計算。例如未巫,如果對16位int型數(shù)和32位long? int型數(shù)進行加法操作窿撬,那么編譯器將安排把16位
int型值轉(zhuǎn)換成32位值。如果是int型數(shù)據(jù)和float型數(shù)據(jù)進行加法操作叙凡,那么編譯器將安排把int型值轉(zhuǎn)換成為float格式劈伴。這個轉(zhuǎn)
換過程稍微復(fù)雜一些,因為int型值和float型值的存儲方式不同握爷。因為編譯器可以自動處理這些轉(zhuǎn)換而無需程序員介入跛璧,所以這
類轉(zhuǎn)換稱為隱式轉(zhuǎn)換(implicit conversion)严里。C語言還允許程序員通過使用強制運算符執(zhí)行顯式轉(zhuǎn)換(explicit conversio
n)。首先討論隱式轉(zhuǎn)換赡模,田炭,執(zhí)行隱式轉(zhuǎn)換的規(guī)則有些復(fù)雜,主要是因為C語言有大量不同的基本數(shù)據(jù)類型(6種整型和3種浮點
型漓柑,這還不包括字符型)教硫。
當發(fā)生下列情況時會進行隱式轉(zhuǎn)換:
.當算術(shù)表達式或邏輯表達式中操作數(shù)的類型不相同時。(C語言執(zhí)行所謂的常用算術(shù)轉(zhuǎn)換辆布。)
.當賦值運算符右側(cè)表達式的類型和左側(cè)變量的類型不匹配時瞬矩。
.當函數(shù)調(diào)用中使用的參數(shù)類型與其對應(yīng)的參數(shù)的類型不匹配時。
.當return語句中表達式的類型和函數(shù)返回值的類型不匹配時锋玲。
隱式類型轉(zhuǎn)換規(guī)則:
C語言自動轉(zhuǎn)換不同類型的行為稱之為隱式類型轉(zhuǎn)換 景用,轉(zhuǎn)換的基本原則是:低精度類型向高精度類型轉(zhuǎn)換,具體是:
int -> unsigned int -> long -> unsigned long -> long long -> unsigned long long -> float -> double -> long double
注意惭蹂,上面的順序并不一定適用于你的機器伞插,比如當int和long具有相同字長時,unsigned int的精度就會比long的精度高
(事實上大多數(shù)針對32機的編譯器都是如此)盾碗。另外需要注意的一點是并沒有將char和short型寫入上式媚污,原因是他們可以被提升
到int也可能被提升到unsigned int。
提升數(shù)據(jù)的精度通常是一個平滑無損害的過程廷雅,但是降低數(shù)據(jù)的精度可能導(dǎo)致真正的問題耗美。原因很簡單:一個較低精度的
類型可能不夠大,不能存放一個具有更高精度的完整的數(shù)據(jù)航缀。一個1字節(jié)的char變量可以存放整數(shù)101但不能存放整數(shù)12345商架。
當把浮點類型數(shù)據(jù)轉(zhuǎn)換為整數(shù)類型時,他們被趨零截尾或舍入芥玉。
當把有符號操作數(shù)和無符號操作數(shù)整合時蛇摸,會通過把符號位看成數(shù)的位的方法把有符號操作數(shù)"轉(zhuǎn)換"成無符號的值.這條
規(guī)則可能會導(dǎo)致某些隱蔽的編程錯誤。
假設(shè)int型的變量i的值為-10灿巧,而且unsigned int型的變量u的值為10皇型。如果用<運算符比較變量i和變u,那么期望的結(jié)果
應(yīng)該是1(真)砸烦。但是弃鸦,在比較前,變量i轉(zhuǎn)換成為unsigned? int類型幢痘。因為負數(shù)不能被表示成無符號整數(shù)唬格,所以轉(zhuǎn)換后的數(shù)值
將不再為-10,而是一個大的正數(shù)(將變量i中的位看作是無符號數(shù)).因此i
由于此類陷阱的存在,所以最好盡最避免使用無符號整數(shù)购岗,特別是不要把它和有符號整數(shù)混合使用汰聋。
強制類型轉(zhuǎn)換:
通常我們應(yīng)該避免自動類型轉(zhuǎn)換,當我們需要手動指定一個準確的數(shù)據(jù)類型時喊积,我們可以用強制類型轉(zhuǎn)換機制來達到我們的目
的烹困,使用方法很簡單,在需要強制轉(zhuǎn)換類型的變量或常量前面加上(type)乾吻,例如(double)i; 即把變量 i 強制轉(zhuǎn)換成double型髓梅。