C語(yǔ)言中的數(shù)據(jù)類(lèi)型強(qiáng)制轉(zhuǎn)換
C語(yǔ)言數(shù)據(jù)類(lèi)型強(qiáng)制轉(zhuǎn)換
強(qiáng)制類(lèi)型轉(zhuǎn)換:是通過(guò)類(lèi)型轉(zhuǎn)換運(yùn)算來(lái)實(shí)現(xiàn)的,主要的數(shù)據(jù)類(lèi)型轉(zhuǎn)換分為自動(dòng)轉(zhuǎn)換和強(qiáng)制轉(zhuǎn)換。
需要注意,不管哪種轉(zhuǎn)換,都是暫時(shí)改變表達(dá)式的值, 都只是為了本次運(yùn)算的需要而對(duì)變量的數(shù)據(jù)長(zhǎng)度進(jìn)行的臨時(shí)性轉(zhuǎn)換,而不改變數(shù)據(jù)說(shuō)明時(shí)對(duì)該變量定義的類(lèi)型。
其一般形式為:(類(lèi)型說(shuō)明符)(表達(dá)式)
其功能是把表達(dá)式的運(yùn)算結(jié)果強(qiáng)制轉(zhuǎn)換成(類(lèi)型說(shuō)明符)所表示的類(lèi)型
自動(dòng)轉(zhuǎn)換
是在源類(lèi)型和目標(biāo)類(lèi)型兼容,以及目標(biāo)類(lèi)型廣于源類(lèi)型時(shí)發(fā)生一個(gè)類(lèi)型到另一類(lèi)的轉(zhuǎn)換
例如: (float) a 把a(bǔ)轉(zhuǎn)換為浮點(diǎn)型,(int)(x+y) 把x+y的結(jié)果轉(zhuǎn)換為整型。
但需要注意的是關(guān)于float類(lèi)型運(yùn)算,下面這個(gè)float類(lèi)型的運(yùn)算代碼,輸出結(jié)果是3.400000
#include <stdio.h>int main()
{
int sum = 17, count = 5;
double mean; mean = (double) sum / count;
printf("Value of mean : %f\n", mean );}強(qiáng)制類(lèi)型轉(zhuǎn)換運(yùn)算符的優(yōu)先級(jí)大于除法,因此 sum 的值首先被轉(zhuǎn)換為 double 型,然后除以 count,得到一個(gè)類(lèi)型為 double 的值。
在C語(yǔ)言中,如果進(jìn)行兩個(gè)整數(shù)的除法運(yùn)算,結(jié)果會(huì)自動(dòng)舍去小數(shù)部分,例如5/2=2,不是2.5。
所以你想進(jìn)行浮點(diǎn)型的除法運(yùn)算,必須保證至少一個(gè)操作數(shù)是浮點(diǎn)數(shù)。
對(duì)于float類(lèi)型的強(qiáng)制轉(zhuǎn)化運(yùn)算,與int類(lèi)型的強(qiáng)制轉(zhuǎn)換運(yùn)算中
兩個(gè)int類(lèi)型強(qiáng)制轉(zhuǎn)換運(yùn)算要寫(xiě)成(int)(x+y) 把x+y的結(jié)果轉(zhuǎn)換為整型,其中(x+y)加括號(hào)的原因是,x與y是非int型,如果有小數(shù)的運(yùn)算,可能會(huì)發(fā)生進(jìn)1,導(dǎo)致最終轉(zhuǎn)變的整型數(shù)+1,例如:
float x=2.6; float y=3.7; (int)(x+y)=6; (int)x+y=5;
所以對(duì)于強(qiáng)制轉(zhuǎn)變成int類(lèi)型要對(duì)x,y加括號(hào),先進(jìn)行括號(hào)里面的運(yùn)算,在轉(zhuǎn)變成int型。
對(duì)于兩個(gè)float類(lèi)型的強(qiáng)制轉(zhuǎn)換運(yùn)算,必須保證兩個(gè)操作數(shù)中至少有一個(gè)數(shù)是float類(lèi)型。
如:
int x=3; int y=2;(float)x/y=1.500000; //先把x變成float類(lèi)型,在與int類(lèi)型的y進(jìn)行除法運(yùn)算,結(jié)果是float類(lèi)型計(jì)算完整結(jié)果的1.5 (float)(x/y)=1.000000; //先把兩個(gè)int類(lèi)型的x與y進(jìn)行計(jì)算,結(jié)果是1,在轉(zhuǎn)變成float類(lèi)型1.0,可知計(jì)算不完整。 (float)x/(float)y=1.500000; //先把int類(lèi)型的x轉(zhuǎn)換成float類(lèi)型,再把int類(lèi)型的y轉(zhuǎn)換成float類(lèi)型,結(jié)果是float類(lèi)型的1.5,計(jì)算結(jié)果完整。
類(lèi)型轉(zhuǎn)換可以是隱式的,由編譯器自動(dòng)執(zhí)行,也可以是顯式的,通過(guò)使用強(qiáng)制類(lèi)型轉(zhuǎn)換運(yùn)算符來(lái)指定。在編程時(shí),有需要類(lèi)型轉(zhuǎn)換的時(shí)候都用上強(qiáng)制類(lèi)型轉(zhuǎn)換運(yùn)算符,是一種良好的編程習(xí)慣。
如果一個(gè)運(yùn)算符兩邊的運(yùn)算數(shù)類(lèi)型不同,先要將其轉(zhuǎn)換為相同的類(lèi)型,即較低類(lèi)型轉(zhuǎn)換為較高類(lèi)型,然后再參加運(yùn)算,轉(zhuǎn)換規(guī)則如下所示。
double ←── float 高
↑
long
↑
unsigned
↑
int ←── char,short 低
圖中橫向箭頭表示必須的轉(zhuǎn)換,如兩個(gè)float型數(shù)參加運(yùn)算,雖然它們類(lèi)型相同,但仍要先轉(zhuǎn)成double型再進(jìn)行運(yùn)算,結(jié)果亦為double型。
縱向箭頭表示當(dāng)運(yùn)算符兩邊的運(yùn)算數(shù)為不同類(lèi)型時(shí)的轉(zhuǎn)換,如一個(gè)long 型數(shù)據(jù)與一個(gè)int型數(shù)據(jù)一起運(yùn)算,需要先將int型數(shù)據(jù)轉(zhuǎn)換為long型, 然后兩者再進(jìn)行運(yùn)算,結(jié)果為long型。
所有這些轉(zhuǎn)換都是由系統(tǒng)自動(dòng)進(jìn)行的叫自動(dòng)轉(zhuǎn)換, 使用時(shí)你只需從中了解結(jié)果的類(lèi)型即可。這些轉(zhuǎn)換可以說(shuō)是自動(dòng)的,當(dāng)然,C語(yǔ)言也提供了以顯式的形式強(qiáng)制轉(zhuǎn)換類(lèi)型的機(jī)制。
當(dāng)較低類(lèi)型的數(shù)據(jù)轉(zhuǎn)換為較高類(lèi)型時(shí),一般只是形式上有所改變, 而不影響數(shù)據(jù)的實(shí)質(zhì)內(nèi)容, 而較高類(lèi)型的數(shù)據(jù)轉(zhuǎn)換為較低類(lèi)型時(shí)則可能有些數(shù)據(jù)丟失。
強(qiáng)制轉(zhuǎn)換類(lèi)型
說(shuō)明符和表達(dá)式都必須加括號(hào)(單個(gè)變量可以不加括號(hào)),如把(int)(x+y)寫(xiě)成(int)x+y則成了把x轉(zhuǎn)換成int型之后再與y相加了。
無(wú)論是強(qiáng)制轉(zhuǎn)換或是自動(dòng)轉(zhuǎn)換,都只是為了本次運(yùn)算的需要而對(duì)變量的數(shù)據(jù)長(zhǎng)度進(jìn)行的臨時(shí)性轉(zhuǎn)換,而不改變數(shù)據(jù)說(shuō)明時(shí)對(duì)該變量定義的類(lèi)型。
例1:
main()
{
float f=5.75;
printf("f=%d,f=%f\n",(int)f,f);
}
f=5,f=5.750000將float f強(qiáng)制轉(zhuǎn)換成int f ,5.75->5
float f=5.75;
printf("(int)f=%d,f=%f\n",(int)f,f);本例表明,f雖強(qiáng)制轉(zhuǎn)為int型,但只在運(yùn)算中起作用, 是臨時(shí)的,而f本身的類(lèi)型并不改變。因此,(int)f的值為 5(刪去了小數(shù)),而f的值仍為5.75。
數(shù)據(jù)類(lèi)型主要有以下幾種方式

總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- C++引用和強(qiáng)制類(lèi)型轉(zhuǎn)換問(wèn)題小結(jié)
- C++強(qiáng)制類(lèi)型轉(zhuǎn)換詳細(xì)示例代碼
- c#強(qiáng)制類(lèi)型轉(zhuǎn)換int方式
- C++類(lèi)的自動(dòng)轉(zhuǎn)換和強(qiáng)制類(lèi)型轉(zhuǎn)換的實(shí)現(xiàn)示例
- C語(yǔ)言中強(qiáng)制類(lèi)型轉(zhuǎn)換的常見(jiàn)方法
- C++中的強(qiáng)制類(lèi)型轉(zhuǎn)換操作詳解
- c語(yǔ)言struct結(jié)構(gòu)體強(qiáng)制類(lèi)型轉(zhuǎn)換的實(shí)現(xiàn)
相關(guān)文章
C++實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)的順序表詳解
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)動(dòng)態(tài)順序表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
實(shí)現(xiàn)一個(gè)內(nèi)存池管理的類(lèi)方法
下面小編就為大家?guī)?lái)一篇實(shí)現(xiàn)一個(gè)內(nèi)存池管理的類(lèi)方法。小編覺(jué)得挺不錯(cuò)的現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01
C語(yǔ)言實(shí)現(xiàn)停車(chē)場(chǎng)管理
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言課程設(shè)計(jì)之停車(chē)場(chǎng)管理問(wèn)題,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12
基于C++實(shí)現(xiàn)Socket交互式服務(wù)端
在?Windows?操作系統(tǒng)中,原生提供了強(qiáng)大的網(wǎng)絡(luò)編程支持,允許開(kāi)發(fā)者使用?Socket?API?進(jìn)行網(wǎng)絡(luò)通信,本文將深入探討如何通過(guò)調(diào)用原生網(wǎng)絡(luò)?API?實(shí)現(xiàn)同步遠(yuǎn)程通信,并介紹了一個(gè)交互式?Socket?類(lèi)的封裝,需要的可以參考下2024-02-02
C語(yǔ)言實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)迷宮實(shí)驗(yàn)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)迷宮實(shí)驗(yàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03
C++使用printf語(yǔ)句實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換的示例代碼
在C語(yǔ)言中,printf 函數(shù)可以直接實(shí)現(xiàn)部分進(jìn)制轉(zhuǎn)換功能,通過(guò)格式說(shuō)明符(format specifier)快速輸出不同進(jìn)制的數(shù)值,下面給大家分享C++使用printf語(yǔ)句實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換的示例代碼,感興趣的朋友一起看看吧2025-04-04
opencv實(shí)現(xiàn)像素統(tǒng)計(jì)的示例代碼
本文介紹了OpenCV中統(tǒng)計(jì)圖像像素信息的常用方法和函數(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01

