天天看點

C語言資料類型是如何被大多數計算機系統所支援?

在讀k&r版的the c programming language一書時,我在[介紹,第3頁]看到這樣一條說明:

因為c語言提供的資料類型和控制結構可以直接被大部分計算機系統所支援,是以在實作自包含程式時所需要的運作庫檔案一般很小。

這段黑體說明了什麼?能否找到一個例子來說明c語言中的某種資料類型或控制結構不被某種計算機系統直接支援呢?

C語言資料類型是如何被大多數計算機系統所支援?

事實上,c語言中确實有不被直接支援的資料類型。

在許多嵌入式系統中,硬體上并沒有浮點運算單元。是以,如果你寫出下面的代碼:

可能會被轉化成下面這種形式:

然後編譯器或标準庫必須提供'floatadd()'的具體實作,這會占用嵌入式系統的記憶體空間。依此去計算代碼在某個微型系統(譯者注:也就是指微型嵌入式系統)的實際位元組數,也會發現有所增加。

另一個常見的例子是64位整型數(c語言标準中'long long'類型是1999年之後才出現的),這種類型在32位系統上也不能直接使用。古董級的sparc系統則不支援整型乘法,是以在運作時必須提供乘法的實作。當然,還有一些其它例子。

相比起來,其它程式設計語言有更加複雜的基本類型。

比如,lisp中的symbol需要大量的運作時實作支援,就像lua中的table、python中的string、fortran中的array,等等。在c語言中等價的類型通常要麼不屬于标準庫(c語言沒有标準symbol或table),要麼更加簡單,而且并不需要那麼多的運作時支援(c語言中的array基本上就是指針,以null結尾的字元串實作起來也很簡單)。

異常處理是c語言中沒有的一種控制結構。非局部的退出隻有'setjmp()'和'longjmp()'兩種,隻能提供儲存和恢複某些部分的處理器狀态。相比之下,c++運作時環境必須先周遊函數調用棧,然後調用析構函數和異常處理函數。

作者:佚名

來源:51cto