C语言开发笔记(一)自动转换和强制转换
? ? ? ? 整型數(shù)據(jù)和實(shí)行數(shù)據(jù)之間可以進(jìn)行運(yùn)算,而且字符型數(shù)據(jù)可以和整型數(shù)據(jù)通用,所以整型、實(shí)型、字符型數(shù)據(jù)之間也是可以進(jìn)行運(yùn)算的,但在運(yùn)算處理之前,不同類型的數(shù)據(jù)要事先轉(zhuǎn)換成同一種數(shù)據(jù)類型。轉(zhuǎn)換方法有兩種:自動(dòng)轉(zhuǎn)換和強(qiáng)制轉(zhuǎn)換。
(1)自動(dòng)轉(zhuǎn)換
原則:
1、若參與運(yùn)算量的類型不同,則先轉(zhuǎn)換成同一類型,然后進(jìn)行運(yùn)算;
2、轉(zhuǎn)換按數(shù)據(jù)長(zhǎng)度增加的方向進(jìn)行,以保證精度不降低。如int型和long型運(yùn)算時(shí),先把int型轉(zhuǎn)換成long型后再進(jìn)行運(yùn)算;
3、所有浮點(diǎn)運(yùn)算都是以雙精度進(jìn)行的,即使僅含float單精度量運(yùn)算的表達(dá)式,也要先轉(zhuǎn)換成double型,再進(jìn)行運(yùn)算;
4、char型和short型參與運(yùn)算時(shí),必須先轉(zhuǎn)換成int型;
5、在賦值運(yùn)算中,賦值號(hào)兩邊量的數(shù)據(jù)類型不同時(shí),賦值號(hào)右邊量的類型將轉(zhuǎn)換為左邊量的類型。如果右邊量的數(shù)據(jù)類型長(zhǎng)于左邊時(shí),將丟失一部分?jǐn)?shù)據(jù),這樣會(huì)降低精度,丟失的部分按四舍五入向前舍入。
?
需要注意的是,char轉(zhuǎn)為double的過(guò)程是一次性的,無(wú)需中間過(guò)程,其他轉(zhuǎn)換同樣。
如果運(yùn)算中同時(shí)包含有符號(hào)signed和無(wú)符號(hào)unsigned的數(shù)據(jù),會(huì)自動(dòng)地隱式地將有符號(hào)轉(zhuǎn)換為無(wú)符號(hào),即signed->unsigned。
舉例說(shuō)明
#include <stdio.h>int main(void) {int a = -1;unsigned int b = 1;int c = 0;c = a > b ? a : b; return 0; }正常邏輯是-1 < 1,所以c的值是1。
但實(shí)際運(yùn)行后c的值是-1。
在編譯的時(shí)候編譯器兄弟也告訴我們:
解析:當(dāng)運(yùn)算a > b時(shí),a先自動(dòng)轉(zhuǎn)換成unsgined,其值即為-1,再與b比較是否比b的值大,結(jié)果為真,所以a的值賦值給c。
我們稍微修改代碼,讓c成為unsigned。
#include <stdio.h>int main(void) {int a = -1;unsigned int b = 1;unsigned int c = 0;c = a > b ? a : b; return 0; }這時(shí)候看到結(jié)果為
C語(yǔ)言中有符號(hào)整型變量把數(shù)據(jù)的最高位作為符號(hào)位使用,因此能表示數(shù)的正負(fù);
無(wú)符號(hào)整型變量把數(shù)據(jù)的最高位最為數(shù)據(jù)位使用,因此不能表示負(fù)數(shù)。
?
(2)強(qiáng)制轉(zhuǎn)換
強(qiáng)制轉(zhuǎn)換格式為:(數(shù)據(jù)類型)(表達(dá)式)。
需要注意(int)x+y是先把x轉(zhuǎn)換成int型后再與y相加,而(int)(x+y)是把x和y相加的結(jié)果轉(zhuǎn)換成int型。
?
無(wú)論是自動(dòng)轉(zhuǎn)換還是強(qiáng)制轉(zhuǎn)換,都只是為了本次運(yùn)算的需要而對(duì)變量的數(shù)據(jù)長(zhǎng)度進(jìn)行的臨時(shí)性轉(zhuǎn)換,而不改變數(shù)據(jù)說(shuō)明時(shí)對(duì)該變量定義的類型。
總結(jié)
以上是生活随笔為你收集整理的C语言开发笔记(一)自动转换和强制转换的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 地下城与勇士飞跃礼包限制购买
- 下一篇: C语言开发笔记(三)自加和自减