• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      嵌入式C 語言數(shù)據(jù)類型轉(zhuǎn)換淺析

      2020-11-24 20:47:07張正宜杜秋來新余學(xué)院
      數(shù)碼世界 2020年1期
      關(guān)鍵詞:編譯器數(shù)據(jù)類型賦值

      張正宜 杜秋來 新余學(xué)院

      一、引言

      嵌入式微處理器技術(shù)發(fā)展迅速,采用更高效的編程語言已成為嵌入式系統(tǒng)開發(fā)者的必然選擇。而C 語言作為為數(shù)不多的同時(shí)具備高級(jí)語言和低級(jí)語言優(yōu)良性能,可以直接控制硬件的高級(jí)語言之一,得到了大多數(shù)程序員的青睞,而且C 語言作為計(jì)算機(jī)相關(guān)專業(yè)及許多非計(jì)算機(jī)專業(yè)的入門編程語言,有非常好的群眾基礎(chǔ)。嵌入式C 語言就是在C 語言的基礎(chǔ)上,針對(duì)硬件系統(tǒng)進(jìn)行優(yōu)化,特別是數(shù)據(jù)類型及數(shù)據(jù)存儲(chǔ)和訪問機(jī)制。區(qū)別在于使用時(shí)考慮的角度不同及習(xí)慣不同,如嵌入式C 語言開發(fā)會(huì)更在乎效率和內(nèi)存有效使用等。

      二、嵌入式C 語言數(shù)據(jù)類型

      數(shù)據(jù)類型在數(shù)據(jù)結(jié)構(gòu)中的定義是一個(gè)值的集合以及定義在這個(gè)值集上的一組操作。C 語言是一種“強(qiáng)類型”編程語言,即C 語言中每一種數(shù)據(jù)都有特定的數(shù)據(jù)類型,并且在程序編譯過程中要對(duì)每個(gè)常量和變量的數(shù)據(jù)類型進(jìn)行檢查,不一致會(huì)報(bào)錯(cuò)。

      嵌入式C 要對(duì)不同的處理器編程,因此它的數(shù)據(jù)類型比較復(fù)雜,與所編程的對(duì)象處理器直接相關(guān),不同的處理器,會(huì)擴(kuò)充新的數(shù)據(jù)類型。類型復(fù)雜的數(shù)據(jù),使用起來靈活多變,經(jīng)常要進(jìn)行類型間的相互轉(zhuǎn)換,給初學(xué)者的使用造成較大麻煩,且容易出錯(cuò)。本文針對(duì)上述問題,對(duì)嵌入式C 語言中算術(shù)類型轉(zhuǎn)換、賦值類型轉(zhuǎn)換、強(qiáng)制類型轉(zhuǎn)換這三種常見的基本數(shù)據(jù)類型轉(zhuǎn)換進(jìn)行深入的探討和歸納,同時(shí)對(duì)三種類型轉(zhuǎn)換進(jìn)行總結(jié)對(duì)比,并通過典型程序舉例分析了在編程中的實(shí)際應(yīng)用。

      三、嵌入式C 語言數(shù)據(jù)類型轉(zhuǎn)換機(jī)制

      (一)自動(dòng)類型轉(zhuǎn)換

      自動(dòng)類型轉(zhuǎn)換就是編譯器隱形進(jìn)行的數(shù)據(jù)類型轉(zhuǎn)換,這種轉(zhuǎn)換不需要程序員干預(yù),會(huì)自動(dòng)發(fā)生。在有多種數(shù)據(jù)類型混合計(jì)算的時(shí)候,若未人為控制類型,系統(tǒng)會(huì)自動(dòng)進(jìn)行類型轉(zhuǎn)換。

      1、將一種類型的數(shù)據(jù)賦值給另外一種類型的變量時(shí)就會(huì)發(fā)生自動(dòng)類型轉(zhuǎn)換,例如:float f = 100;100 是 int 類型的數(shù)據(jù),需要先轉(zhuǎn)換為float 類型才能賦值給變量 f。在賦值運(yùn)算中,賦值號(hào)兩邊的數(shù)據(jù)類型不同時(shí),需要把右邊表達(dá)式的類型轉(zhuǎn)換為左邊變量的類型,這可能會(huì)導(dǎo)致數(shù)據(jù)失真,或者精度降低;所以說,自動(dòng)類型轉(zhuǎn)換并不一定是安全的。對(duì)于不安全的類型轉(zhuǎn)換,編譯器一般會(huì)給出警告。

      2、在不同類型的混合運(yùn)算中,編譯器也會(huì)自動(dòng)地轉(zhuǎn)換數(shù)據(jù)類型,將參與運(yùn)算的所有數(shù)據(jù)先轉(zhuǎn)換為同一種類型,然后再進(jìn)行計(jì)算。轉(zhuǎn)換的規(guī)則如下:

      轉(zhuǎn)換按數(shù)據(jù)長度增加的方向進(jìn)行,以保證數(shù)值不失真,或者精度不降低。例如,int 和long 參與運(yùn)算時(shí),先把int 類型的數(shù)據(jù)轉(zhuǎn)成long 類型后再進(jìn)行運(yùn)算。所有的浮點(diǎn)運(yùn)算都是以雙精度進(jìn)行的,即使運(yùn)算中只有float 類型,也要先轉(zhuǎn)換為double 類型,才能進(jìn)行運(yùn)算。

      自動(dòng)類型轉(zhuǎn)換示例:

      #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 ", s1, s2);

      return 0;

      }

      運(yùn)行結(jié)果:s1=78, s2=78.539749。在計(jì)算表達(dá)式r*r*PI 時(shí),r和 PI 都被轉(zhuǎn)換成 double 類型,表達(dá)式的結(jié)果也是double 類型。但由于s1 為整型,所以賦值運(yùn)算的結(jié)果仍為整型,舍去了小數(shù)部分,導(dǎo)致數(shù)據(jù)失真。

      (二)賦值轉(zhuǎn)換

      如果賦值運(yùn)算符兩側(cè)數(shù)據(jù)類型不一致,則在賦值時(shí)會(huì)發(fā)生賦值類型轉(zhuǎn)換。

      1、int 型與float 型

      將float 類型賦值給int 型時(shí),會(huì)舍去小數(shù)部分。

      如:int a = 3.5;//此時(shí)a 的值是3

      將int 類型賦值給float 型時(shí),數(shù)值會(huì)以float 類型存儲(chǔ)。

      如:float f = 4;//此時(shí)f 的值是4.0

      2、float 型與double 型

      將double 型賦值給float 型時(shí),截取7 位有效數(shù)字存儲(chǔ)在float類型中。但要注意不要超過float 類型的存儲(chǔ)范圍(因?yàn)閐ouble 類型存儲(chǔ)范圍比float 類型大)

      3、char 型與int 型

      將int類型賦值給char類型時(shí),直接截取低8位存儲(chǔ)在char型中。

      將char 類型賦值給int 類型時(shí),分兩種情況:

      ⑴無符號(hào)char 類型(即unsigned char 型),數(shù)據(jù)存儲(chǔ)在int類型低8 位,剩下24 位補(bǔ)0;

      ⑵有符號(hào)char 類型,數(shù)據(jù)存儲(chǔ)在int 型低8 位。若char 首位是0,則int 型剩下24 位補(bǔ)0;若char 首位是1,則int 型剩下24 位補(bǔ)1;

      (三)強(qiáng)制數(shù)據(jù)類型轉(zhuǎn)換

      自動(dòng)類型轉(zhuǎn)換是編譯器根據(jù)代碼的上下文環(huán)境自行判斷的結(jié)果,不能滿足所有的需求,程序員可以自己在代碼中明確地提出要進(jìn)行類型轉(zhuǎn)換,稱為強(qiáng)制類型轉(zhuǎn)換。

      強(qiáng)制類型轉(zhuǎn)換的格式為:

      (type_name) expression

      type_name 為新類型名稱,expression 為表達(dá)式。

      下面是一個(gè)需要強(qiáng)制類型轉(zhuǎn)換的經(jīng)典例子:

      1.#include

      2.int main(){

      3.int sum = 103; //總數(shù)

      4.int count = 7; //數(shù)目

      5.double average; //平均數(shù)

      6. average = (double) sum / count;

      7.printf("Average is %lf! ", average);

      8.return 0;

      9.}

      運(yùn)行結(jié)果:Average is 14.714286!

      sum 和count 都是 int 類型,如果不進(jìn)行干預(yù),則sum/count的運(yùn)算結(jié)果也是int 類型,小數(shù)部分將被丟棄;雖然是average 是double 類型,可以接收小數(shù)部分,但是小數(shù)部分提前就被“閹割”了,只能接收到整數(shù)部分,導(dǎo)致除法運(yùn)算的結(jié)果嚴(yán)重失真。為了提高運(yùn)算結(jié)果的精度呢,程序員只要將sum 或者count 其中之一轉(zhuǎn)換為double 類型即可。

      類型轉(zhuǎn)換只是臨時(shí)性的,無論是自動(dòng)類型轉(zhuǎn)換還是強(qiáng)制類型轉(zhuǎn)換,都只是為了本次運(yùn)算而進(jìn)行的臨時(shí)性轉(zhuǎn)換,轉(zhuǎn)換的結(jié)果也會(huì)保存到臨時(shí)的內(nèi)存空間,不會(huì)改變數(shù)據(jù)本來的類型或者值。

      (四)自動(dòng)類型轉(zhuǎn)換VS 強(qiáng)制類型轉(zhuǎn)換

      在C 語言中,有些類型既可以自動(dòng)轉(zhuǎn)換,也可以強(qiáng)制轉(zhuǎn)換,例如int 到 double,float 到 int 等;而有些類型只能強(qiáng)制轉(zhuǎn)換,不能自動(dòng)轉(zhuǎn)換,例如以后將要學(xué)到的 void * 到 int *,int 到 char * 等??梢宰詣?dòng)轉(zhuǎn)換的類型一定能夠強(qiáng)制轉(zhuǎn)換,但是,需要強(qiáng)制轉(zhuǎn)換的類型不一定能夠自動(dòng)轉(zhuǎn)換。

      可以自動(dòng)進(jìn)行的類型轉(zhuǎn)換一般風(fēng)險(xiǎn)較低,不會(huì)對(duì)程序帶來嚴(yán)重的后果,例如,int 到 double 沒有什么缺點(diǎn),float 到 int 存在數(shù)值失真。

      四、小結(jié)

      本文從嵌入式C 語言的數(shù)據(jù)類型的復(fù)雜性及重要性引入,通過數(shù)據(jù)類型基本概念,主要闡述了嵌入式C 語言中算術(shù)類型轉(zhuǎn)換、賦值類型轉(zhuǎn)換、強(qiáng)制類型轉(zhuǎn)換的規(guī)則、格式及典型應(yīng)用,并對(duì)自動(dòng)類型轉(zhuǎn)換與強(qiáng)制類型轉(zhuǎn)換進(jìn)行了比較,對(duì)存在的風(fēng)險(xiǎn)進(jìn)行了分析。

      猜你喜歡
      編譯器數(shù)據(jù)類型賦值
      關(guān)于1 1/2 … 1/n的一類初等對(duì)稱函數(shù)的2-adic賦值
      L-代數(shù)上的賦值
      詳談Java中的基本數(shù)據(jù)類型與引用數(shù)據(jù)類型
      如何理解數(shù)據(jù)結(jié)構(gòu)中的抽象數(shù)據(jù)類型
      基于相異編譯器的安全計(jì)算機(jī)平臺(tái)交叉編譯環(huán)境設(shè)計(jì)
      強(qiáng)賦值幺半群上的加權(quán)Mealy機(jī)與加權(quán)Moore機(jī)的關(guān)系*
      利用賦值法解決抽象函數(shù)相關(guān)問題オ
      通用NC代碼編譯器的設(shè)計(jì)與實(shí)現(xiàn)
      編譯器無關(guān)性編碼在微控制器中的優(yōu)勢
      基于ARM嵌入式平臺(tái)的x86譯碼SOC架構(gòu)設(shè)計(jì)
      陆丰市| 洛扎县| 伊川县| 双城市| 铜陵市| 淮阳县| 伽师县| 淳化县| 微博| 疏勒县| 西昌市| 镇坪县| 专栏| 横山县| 濉溪县| 通渭县| 麟游县| 唐海县| 沙田区| 子长县| 遵义县| 镇远县| 神农架林区| 新竹市| 青铜峡市| 聂荣县| 通城县| 冷水江市| 岑溪市| 芦山县| 登封市| 鄱阳县| 阿荣旗| 东源县| 柳江县| 日照市| 保山市| 宜春市| 宝鸡市| 澎湖县| 泉州市|