0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

什么是數(shù)據(jù)類型轉換

汽車電子技術 ? 來源:C語言Plus ? 作者: Maye426 ? 2023-02-27 15:04 ? 次閱讀

數(shù)據(jù)類型轉換

數(shù)據(jù)類型轉換就是將數(shù)據(jù)(變量、數(shù)值、表達式的結果等)從一種類型轉換為另一種類型。

自動類型轉換

自動類型轉換就是編譯器默默地、隱式地、偷偷地進行的數(shù)據(jù)類型轉換,這種轉換不需要程序員干預,會自動發(fā)生。

  1. 將一種類型的數(shù)據(jù)賦值給另外一種類型的變量時就會發(fā)生自動類型轉換,例如:
float f = 100;

100 是 int 類型的數(shù)據(jù),需要先轉換為 float 類型才能賦值給變量 f。再如:

int n = f;

f 是 float 類型的數(shù)據(jù),需要先轉換為 int 類型才能賦值給變量 n。

在賦值運算中,賦值號兩邊的數(shù)據(jù)類型不同時,需要把右邊表達式的類型轉換為左邊變量的類型,這可能會導致數(shù)據(jù)失真(數(shù)據(jù)輸入和輸出不一致),或者精度降低;所以說,自動類型轉換并不一定是安全的。對于不安全的類型轉換,編譯器一般會給出警告。

  1. 在不同類型的混合運算中,編譯器也會自動地轉換數(shù)據(jù)類型,將參與運算的所有數(shù)據(jù)先轉換為同一種類型,然后再進行計算。轉換的規(guī)則如下:
  • 轉換按數(shù)據(jù)長度增加的方向進行,以保證數(shù)值不失真,或者精度不降低。例如,int 和 long 參與運算時,先把 int 類型的數(shù)據(jù)轉成 long 類型后再進行運算。
  • 所有的浮點運算都是以雙精度進行的,即使運算中只有 float 類型,也要先轉換為 double 類型,才能進行運算。
  • char 和 short 參與運算時,必須先轉換成 int 類型。

圖片

自動類型轉換示例:

#include
 int main()
{    
     float PI = 3.14159;    
     int s1, r = 5;    
     double s2;    
     s1 = r * r * PI;    
     s2 = r * r * PI;    
     printf("s1=%d, s2=%f\\n", s1, s2);    
     return 0;
 }

運行結果:s1=78, s2=78.539749

在計算表達式r*r*PI時,r 和 PI 都被轉換成 double 類型,表達式的結果也是 double 類型。但由于 s1 為整型,所以賦值運算的結果仍為整型,舍去了小數(shù)部分,導致數(shù)據(jù)精度丟失。

強制類型轉換

自動類型轉換是編譯器根據(jù)代碼的上下文環(huán)境自行判斷的結果,有時候并不是那么“智能”,不能滿足所有的需求。如果需要,程序員也可以自己在代碼中明確地提出要進行類型轉換,這稱為強制類型轉換。

強制類型轉換的格式為:

(type) expression

type為目標類型名稱,expression為表達式。例如:

(float) a;  //將變量 a 轉換為 float 類型
 (int)(x+y);  //把表達式 x+y 的結果轉換為 int 整型
 (float) 100;  //將數(shù)值 100(默認為int類型)轉換為 float 類型

下面是一個需要強制類型轉換的經(jīng)典例子:

#include 
 int main()
{    
     int sum = 315;  //總數(shù)    
     int count = 7;  //數(shù)目    
     double average;  //平均數(shù)    
     average = (double) sum / count;    
     printf("Average is %lf!\\n", average);    
     return 0;
 }
 output:Average is 44.714286!

sum 和 count 都是 int 類型,如果不進行干預,那么sum / count的運算結果也是 int 類型,小數(shù)部分將被丟棄;雖然是 average 是 double 類型,可以接收小數(shù)部分,但是心有余力不足,小數(shù)部分提前就被“閹割”了,它只能接收到整數(shù)部分,這就導致除法運算的結果嚴重失真。

既然 average 是 double 類型,為何不充分利用,盡量提高運算結果的精度呢?為了達到這個目標,我們只要將 sum 或者 count 其中之一轉換為 double 類型即可。上面的代碼中,我們將 sum 強制轉換為 double 類型,這樣sum / count的結果也將變成 double 類型,就可以保留小數(shù)部分了,average 接收到的值也會更加精確。

注意不要寫作(double) (sum / count),這樣寫運算結果將是 44.000000,仍然不能保留小數(shù)部分。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 數(shù)值
    +關注

    關注

    0

    文章

    80

    瀏覽量

    14449
  • 變量
    +關注

    關注

    0

    文章

    613

    瀏覽量

    28579
  • 數(shù)據(jù)類型

    關注

    0

    文章

    236

    瀏覽量

    13694
收藏 人收藏

    評論

    相關推薦

    JAVA語言的數(shù)據(jù)類型轉換

    JAVA語言的數(shù)據(jù)類型轉換很多場合需要用到類型轉換。例如,要把一個整型變量作為字符型變量來使用,就需要使用類型
    發(fā)表于 12-06 00:30

    【初級】labview教程每日一教之數(shù)據(jù)文件操作+數(shù)據(jù)類型轉換

    .[hide][/hide]13數(shù)據(jù)類型轉換在使用LabVIEW編程過程中,已有的數(shù)據(jù)類型不能滿足我們進一步處理的需要,常常需要對數(shù)據(jù)類型進行轉換
    發(fā)表于 11-07 10:01

    串口數(shù)據(jù)類型轉換問題

    串口接收到的二進制數(shù)據(jù),到LabVIEW后被轉換為字符串格式,這個過程怎么做?
    發(fā)表于 05-09 11:33

    labview 輸出數(shù)據(jù)類型轉換

    問題,DAQmx輸出的是1D DBL的數(shù)組,經(jīng)過數(shù)組子集與時間標識常量相組合使用的是捆綁嗎?里面時間變量t0、dt如何設置?加入了時間常量怎么在輸出端輸出和示波器想匹配的數(shù)據(jù)類型?
    發(fā)表于 10-29 13:21

    數(shù)據(jù)類型轉換

    請問碰到這種情況該如何進行轉換呢?
    發(fā)表于 11-14 14:38

    關于數(shù)據(jù)類型轉換的問題

    如圖,最右邊的反饋節(jié)點輸出M序列。這個M序列的數(shù)據(jù)類型是布爾型。樓主想把M序列的數(shù)據(jù)類型轉換成布爾型數(shù)組。想了好久都不知道該怎么操作。希望能有人解答。樓主不勝感激
    發(fā)表于 04-27 21:07

    使用ActiveX函數(shù)與MATLAB建立連接時,變體數(shù)據(jù)類型轉換出現(xiàn)問題,應該怎么解決啊

    使用ActiveX函數(shù)與MATLAB接口創(chuàng)建一個隨機值矩陣并在MATLAB軟件中顯示該矩陣圖形,變體數(shù)據(jù)類型轉換出現(xiàn)問題,應該怎么解決啊
    發(fā)表于 04-26 15:53

    請問使用強制數(shù)據(jù)類型轉換函數(shù)的時候,數(shù)據(jù)類型type端該如何設置,才能使數(shù)據(jù)成功轉換類型

    本帖最后由 一只耳朵怪 于 2018-6-26 08:51 編輯 使用強制數(shù)據(jù)類型轉換函數(shù)的時候,數(shù)據(jù)類型type端該如何設置,才能使數(shù)據(jù)成功
    發(fā)表于 06-25 20:33

    請問28069的CLA不支持數(shù)據(jù)類型轉換嗎?

    = AdcResult.ADCRESULT8;// AdcResult.ADCRESULT8的值為0x0FFF;// 執(zhí)行下面的語句之后lValue = 0lValue = AdcResult.ADCRESULT8;// AdcResult.ADCRESULT8的值為0x0FFF;難道28069的CLA不支持數(shù)據(jù)類型
    發(fā)表于 12-17 14:45

    數(shù)據(jù)類型如何轉換

    unsigned int num = 0;unsigned char i = 0x12;num = i;程序執(zhí)行后,是不是把 i 的值賦給num的低8位、、、、、、、、、、
    發(fā)表于 06-16 04:35

    輻照度計中串行通訊數(shù)據(jù)類型轉換的研究

    本文探討了上位機利用MSCOMM 與輻照度計進行串行通訊過程中數(shù)據(jù)類型轉換的問題。分析了VC++6.0 環(huán)境下串行通訊中幾種特殊數(shù)據(jù)結構間的關系,總結出了發(fā)送及接收數(shù)據(jù)時可用的幾
    發(fā)表于 12-12 15:16 ?14次下載

    LabVIEW初級教程之數(shù)據(jù)類型轉換的詳細資料說明

    在使用LabVIEW編程過程中,已有的數(shù)據(jù)類型不能滿足我們進一步處理的需要,常常需要對數(shù)據(jù)類型進行轉換。比如不同表示法的數(shù)值類型之間轉換,或
    發(fā)表于 03-24 15:03 ?26次下載
    LabVIEW初級教程之<b class='flag-5'>數(shù)據(jù)類型</b><b class='flag-5'>轉換</b>的詳細資料說明

    SpinalHDL中Bundle數(shù)據(jù)類型轉換

    SpinalHDL中Bundle與SystemVerilog中的packed struct很像,在某些場景下,與普通數(shù)據(jù)類型之間的連接賦值可以通過asBits,assignFromBits來實現(xiàn)。
    的頭像 發(fā)表于 10-17 09:51 ?1443次閱讀

    什么是數(shù)據(jù)類型轉換

    常用的3種數(shù)據(jù)類型:1、Python數(shù)據(jù)類型第一種:字符串(str)。 2、Python數(shù)據(jù)類型第二種:整數(shù)(int)。 3、Python數(shù)據(jù)類型第三種:浮點數(shù)(float)。
    的頭像 發(fā)表于 02-23 15:21 ?1852次閱讀

    GaussDB數(shù)據(jù)類型轉換介紹

    數(shù)據(jù)類型轉換在實際應用中非常常見。GaussDB 作為一款企業(yè)級分布式關系型數(shù)據(jù)庫,在實際業(yè)務場景使用中,也會避免不了數(shù)據(jù)類型轉換。以下是
    的頭像 發(fā)表于 06-05 16:29 ?990次閱讀
    GaussDB<b class='flag-5'>數(shù)據(jù)類型</b><b class='flag-5'>轉換</b>介紹