女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

3天內不再提示

C語言的數據儲存與數據類型及類型轉換的詳細資料說明

Wildesbeast ? 來源:今日頭條 ? 作者:虎牙來了 ? 2020-02-24 15:39 ? 次閱讀

程序說到底就是對數據的處理,所以首先要弄清楚需要處理哪些數據,計算機如何存儲這些數據。C語言根據需要,抽象出了一些基本數據類型和衍生數據類型。這些可以滿足大部分需求,更復雜的抽象數據類型亦可通過它們來組成。

1. 數據存儲

計算機存儲的最小單位是bit,它表示0或1。而計算機可尋址的最小單位是byte,它至少由8個bit組成,內存就是由許多個byte組成并編址的。有OS時,C操作的是邏輯地址,OS會最終轉為物理地址。

一個數據由多個bit組成,按照二進制的表示習慣,將最左側的bit叫做MSB(Most Significant Bit),最右側的bit叫做LSB(Least Significant Bit),這里的significant當然是指該bit表示的數量級。這些bit會劃分到連續的byte中,存儲時byte的順序基于系統或平臺。這又引出了大小端(Endian)的概念,LSB存儲在高地址時叫Big Endian,否則叫Little Endian。但無論如何,該數據的地址都是指最低地址。而且進一步講,數組和結構成員的地址也是按它們的指數或定義順序向高地址增長的,即使在棧里也不例外(棧底一般在高地址,棧頂向低地址增長)。

C提供了關鍵字sizeof獲取數據或類型占用內存的大小,結果以byte為單位。sizeof后如果跟括號,里面可以是類型或表達式,否則后面只能跟表達式。sizeof是運算符而不是函數,它的結果在編譯時確定。如果操作對象是表達式,則返回其對應類型的大小,而不會執行表達式。

計算機處理數據的單位叫word,我們一般說的32位64位計算機就是指word。為了提高處理效率,數據盡量不要或少跨word存儲。這就需要數據的存儲地址是數據長度的整數倍,和類型長度一樣,對齊的單位一般是2的冪?;绢愋蛯R單位是其類型長度,組合類型(數組、結構、聯合)的對齊單位是其成員的最大對齊單位。由于默認對齊的存在,組合類型的成員之間可能有一些空隙,sizeof的結果可能不是簡單的累加了。但要注意,組合類型的成員總是盡量向低地址靠齊,所以組合類型的開頭是不會有空隙的。

新規范中引入了關鍵字_Alignof和_Alignas(同sizeof一樣不是函數),新引入的關鍵字一般以'_'和大寫字母開頭(為了不和編譯器的擴展或用戶自定義沖突),如果想用小寫字母開頭的,需要include對應的標準庫(宏定義)。_Alignof后跟類型,得到類型的對齊單位。_Alignas后跟類型或整數常量,用來修飾類型或變量定義,但它不能小于其原有的對齊單位。

C中數據一般叫對象(object),不同的數據會有不同的類型(type)。類型決定了數據的長度和格式,除此之外的類型屬性(比如const)只有編譯器能看到,而對計算機是透明的。C定義了char、int、float、double四種基本型,還有兩個特殊類型void和枚舉,以及它們的衍生(derived)類型(指針、數組、結構、聯合、函數)?;拘秃兔杜e并稱為代數型(arithmetic),代數型和指針并稱為度量型(scalar),數組和結構并稱為聚合型(aggregate)。整型(interger)包括char、int和枚舉,浮點型包括float和double,整型和浮點型并稱實數型(real)。新規范中還定義了可選關鍵字_Bool、_Complex和_Imaginary,個人認為可以當做基本型,而且_Bool可以劃到整型里。

類型前可以有多種修飾符,它們有不同種類和用途,這里先介紹一類叫類型說明符(非規范定義)。包括short、long、long long(新規范)、signed和unsigned,它們僅作用于基本型,且長度和符號可以組合使用。所有的說明符都可以修飾int,int默認為signed(可不寫),有說明符時int可不寫。signed、unsigned可修飾char,long可修飾double,其它用法皆非法。

2. 數據類型

2.1 整型

整型數有不同的長度,其中char始終為1,int一般為字長,枚舉與int一樣,_Bool基于實現。short至少16bit且不超過int,long至少32bit且不低于int,long long至少64bit且不低于long。無符號整型的值即它的二進制數的值,有符號整型的值基于平臺實現。少數老的平臺采用的是反碼表示法(1's complement),它概念簡單直觀,但卻不方便計算,個人認為注定被淘汰,沒有討論價值?,F在幾乎所有的平臺都使用補碼表示法(2's complement),該模型更符合問題的本質,自然也更便于計算。對于負數,補碼即0減去它的絕對值(有underflow),實現了正負數的平滑連接。

字符型包含char、wchar_t、char16_t和char32_t,其中char是基本類型,其它為int(帶說明符)的宏定義。char類型永遠是1個byte,可表示basic字符集,它的符號是基于實現的。字符常量用一對單引號表示,引號里為字符或轉義序列,引號前有可選前綴L、u和U(分別對應后3種字符型)。字符常量本身的類型為int或unsigned int,它的值為引號中字符的編碼或轉義序列的值。引號中可以有多個字符,但它們在int中的存儲位置是不定義的。下表中列出了轉義序列及其含義:

int型常量以非0數字開頭則表示10進制數,0x或0X開頭表示16進制數,0開頭表示8進制數。后面可以有后綴U、L或LL(不限大小寫),分別表示unsigned、long和long long。U可以和L或LL組合,且順序隨意。int型可以按它能表示的最大數來排序,如果能表示的最大數相同,則按int、long、long long排序。一個可能的隊列為int、long、unsigned int、unsigned long、long long、unsigned long long。int型常量的類型以后綴類型(默認為int)為起點,從隊列中尋找第一個滿足規則且能包含其值的類型。規則是:(1)如果起點為unsigned,則嘗試signed;(2)如果起點為signed且為10進制數,則不嘗試unsigned。另外要注意,不存在負常量,它只是對正常量的負運算。

枚舉(enumeration)是一個特殊的自定義的類型,它為其每一個常量定義了名字,這些常量的值都是int型(可為負數)。枚舉常量的值可以顯式指明,或者為其前一常量加1,第1個常量的隱式值為0。枚舉常量可以像宏一樣使用,往往用于簡單的編號。

2.2 浮點型

浮點型的計算機表示由平臺決定,但幾乎所有實現都遵循規范IEC-60559(IEEE-754),這里簡單介紹一下該規范中的浮點表示。根據數據長度(精度),規范將浮點分為single、double和double-extended,分別對應C中的float、double和long double。float和double的長度分別為32和64,long double未作明確定義。

從MSB到LSB,浮點型被分為符號位(sign,1位)、指數(exponent,8或11位)和尾數(fraction,23或52位),它可表示為以2為底的科學計數。

符號位是整個浮點數的符號,所以會存在正負0和正負無窮。指數被解釋為無符號整數,并減去一個偏差(bias)。偏差值會導致emaxemax比eminemin絕對值大1(考慮到倒數的溢出),比如float類型的偏差為127,emaxemax = 128,eminemin = -127。指數取最大值時,若尾數為0,整個數解釋為正負無窮大,否則為NaN(not a number)。指數為最小值時,尾數解釋為0.f0.f(denormalized),否則解釋為1.f1.f(normalized)。

實數是連續的,無法用計算機精確表示,整個浮點數空間可以看做是實數的采樣。對normalized區段,每個數量級的采樣數是相等的(ff的每一位都有意義),對denormalized區段,每個數量級的采樣數遞減(ff的實際有效位)。denormalized區段指數采用的是emin+1emin+1,而非eminemin,保證了和normalized區段的平滑過渡,很是巧妙!浮點數也支持正負無窮和NaN這類抽象值,為錯誤處理提供了很好的工具。超出表示邊界的值都是無窮大,無意義的數(0/00/0,0?∞0?∞)都表示為NaN,它們亦可參加運算,值視情況而定。浮點運算在運算時保持精度,但對結果進行舍入(每一個運算),舍入的方法是尾數為偶數(round to even)。

由于舍入或正負0的存在,和0的比較變得不可靠,所以不要判斷某浮點數是否為0。在比較兩個浮點數是否相等時,直接用a == b或a != b,不要將a - b與0比較。浮點的舍入會導致原本相近兩個數的差被掩蓋,有時調整算法可以減少誤差,讀者可以思考以下公式變換帶來的精度提高。

浮點常量一般以10為底,新規范支持以2為底的浮點常量(0x開頭),它可以避免精度的丟失。浮點常量的尾數部分不可少,10為底用10進制數,2為底用16進制數。尾數可以為整數或小數,若小數點前或后為0可不寫,但不能同時不寫。指數部分從字母e、E(10為底)或p(2為底)開始,后面都跟10進制數(為了和后綴中的F區分開來)。10為底的浮點常量可以沒有指數部分,但這時尾數不能為整數,否則會被解析為整型。2為底的浮點常量必須有指數,否則后綴F無法與尾數區分。浮點常量默認為double,后綴F和L(不分大小寫)分別表示float和long double,無類型提升(和常整型不同)。

新規范中支持復數(complex)和虛數(imaginary),但是可選功能。多數編譯器是用結構來定義復數的,而不是用關鍵字_Complex和_Imaginary。復數和虛數必須由浮點型修飾,虛數常量ii是基于實現的。除ii外沒有復數常量,是由浮點數的類型提升完成的。

2.3 組合類型

這里的組合類型非標準定義,它指數組、結構和聯合(以后將結構和聯合叫復合類型)。組合類型由多個成員組成,每個成員可以為除void和函數之外的任何一種類型。組合類型是表示復雜類型的重要工具,也是抽象類型的必要元素。

數組由多個相同類型的成員組成,它們在內存中連續分布,可以通過index獲取。C中沒有多維數組的概念,只有數組的數組,僅此而已。數組的長度不能為0,新規范支持結構末尾的可變數組a[](flexible array member),它相當于預定了一個數組的位置,而不一定有成員。含可變數組的結構至少還有另外一個成員,且它不可以再做組合類型的成員。由于align的作用,可變數組與結構最后一個成員之間可能有空隙,該結構的sizeof結果包含該空隙。

字符串是一類特殊的數組,它的成員是字符型。字符串常量定義在一對雙引號中,其中可以是字符或轉義序列,也可以有L、u或U作前綴。字符串常量中不能換行,但可以有空格或tab。連續的字符串常量(中間可有空白)在預處理時會被拼接為一個,該特點便于書寫長字符串和分開轉義序列與普通字符,單字節字符串和寬字節字符串拼接的結果為寬字符。字符串常量(拼接后)末尾有一個隱式的字符'\0',字符串函數把它當做結束符。任何字符串常量(包括初始化字符串)都會存儲在常量區,編譯器可以選擇合并相同的字符串常量。字符串常量可以直接當數組使用,但對其修改是未定義的。

結構體中可以包含不同類型的成員,由它可以組成更復雜的抽象類型。如果從面向對象的角度說,對象的屬性體現在結構的普通成員上,對象之間的關系則體現在結構的指針成員上。結構中還可以定義位域(bit field),位域是指定長度的整型,它被放置在word中??臻g足夠時,相鄰位域緊靠之前的位域,否則未定義。未做顯式說明時,int位域的符號基于實現。對位域的操作效率比普通整型低,它往往用于緊湊空間或一致性需求(傳輸協議)。

聯合也可以包含不同類型的成員,但它們的地址都是一樣的(等于聯合本身的地址),也就是說成員在內存里有重疊。聯合中也可以有位域,它們也是互相重疊的。聯合一般用于結構的分情況解釋或數據的局部操作,后者的一個例子是大小端判斷。

基本類型和字符串都有常量表示,新規范中還支持復合常量(compound literal),它的定義方法是類型后加初始化序列。但復合常量本質上是匿名變量,它和變量的性質幾乎一樣,唯一的差別是const的復合常量和字符串常量有一樣的存儲屬性。

2.4 其它類型

void嚴格來說不是一個類型,單獨使用時表示“沒有”,僅用于表示函數返回、函數參數和表達式。void指針僅表示數據地址,而無數據的類型信息,它取代了舊規范庫中一些場合的char指針。

函數也是一種對象,它的類型由返回類型和參數類型共同決定。而且函數可以看作const的,因為它在代碼區,不可修改。

指針即帶有類型的地址,指針的長度是未定義的,但相同類型的指針長度是相同的。機器碼中的變量使用地址表示的,所以指針變量只不過是地址的地址,無需多做探討。如果說變量是對數據的一般化,則指針變量是對變量的一般化。這種更深層次的功能使得C更靈活更強大,但同時也更危險,因為它影響的不是某個數據。避免問題的關鍵就是一定要“指有所指”,未初始化的指針(dangling pointer)可能破壞任何數據。

空指針是一個特殊的指針常量,它不等于任何有意義的地址,它無法直接表示。常量0在特定語境下表示空指針,但最終的編譯結果未必是0。NULL大部分時候指空指針,宏NULL一定要定義成對0的強制轉換,以避免0的多義性。

還有一類指針常量就是靜態存儲的變量的地址以及函數的地址,它們可以用于初始化靜態存儲的變量(必須用常量初始化,見下章)。

3. 類型轉換

表達式中的操作符有時會引起操作數的類型轉換(type conversion),本節對這類轉換做一些總結。當新類型可以表示操作數時,轉換后的值不變。任何度量類型轉換為_Bool時,如果為0則轉為0,否則轉為1。向unsigned整型轉換時,若操作數是整數則取模,若為浮點則去掉小數部分(整數部分若超出新類型則未定義),若為復數則先去掉虛部。向signed整型轉換時,若操作數超出表示則未定義。向浮點數轉換時,若無法精確表示則舍入方法未定義。向復數轉換時,若操作數無虛部則結果虛部為0。


整型和指針可以互相轉換,但結果是未定義的。指針之間的轉換也可以,但align不一致時未定義。甚至不同類型的函數指針也可以轉換,但無意義。指針轉換并不改變所指向地址的內容,用新指針取值時數據將被重新解釋。

除了顯式的強制轉換外,還會發生一些隱式的轉換,尤其常見于代數運算中。整型提升(integer promotion)將小整型提升為int或unsigned int,若int包含該小整型則轉為int,否則轉為unsigned int。整型提升僅發生于前置+-、~和移位的所有操作數,以及switch語句和常用代數轉換中。常用代數轉換(usual arithmatic conversion)發生在比較、算術(+-*/%)和位(&|^)運算中,它將兩個操作數轉換為相同的類型:

(1)若操作數中有浮點數,則向最高精度浮點數轉換。但整數無需做整型提升,實數無需向復數轉換。

(2)若操作數中沒有浮點數,則先做整型提升。提升后若一個類型包含另一個,則轉換為較大范圍者,否則轉換為較大范圍的無符號類型。

賦值操作、函數的參數傳遞和值返回也可以看做是隱式轉換,當不知道函數參數的類型時,整型要做整型提升,float要轉換為double(default argument promotion)。

另外還有兩個重要的隱式類型轉換必須弄清楚,就是數組名和函數名。數組名即表示整個數組,但在除sizeof、_Alignof和&作用下,數組名自動轉換為首元素的指針。字符串常量在以上3種情況和用作為數組初始化之外,也自動轉換為首元素的指針。函數名是函數類型,在除sizeof、_Alignof和&作用下,函數名自動轉換為相應函數類型的指針。

“我是一名從事了10年開發的老程序員,最近我花了一些時間整理關于C語言、C++,自己有做的材料的整合,一個完整的學習C語言、C++的路線,學習材料和工具。C/C++、編程愛好者的聚集地就在我這里 企鵝進!(14)歡迎初學和進階中的小伙伴。希望你也能憑自己的努力,成為下一個優秀的程序員。工作需要、感興趣、為了入行、轉行需要學習C/C++的伙伴可以跟我一起學習!”

關注我,帶你遨游代碼世界!

最后分享一張C/C++學習路線圖給愛學習的小伙伴們

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 計算機
    +關注

    關注

    19

    文章

    7626

    瀏覽量

    90112
  • 內存
    +關注

    關注

    8

    文章

    3107

    瀏覽量

    74968
  • C語言
    +關注

    關注

    180

    文章

    7630

    瀏覽量

    140164
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    JAVA語言數據類型轉換

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

    C語言程序設計教程之基本數據類型、運算符和表達式的詳細資料概述

    本文檔的主要內容詳細介紹的是C語言程序設計教程之基本數據類型、運算符和表達式的詳細資料概述主要內容包括了:1
    發表于 10-31 18:04 ?30次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>程序設計教程之基本<b class='flag-5'>數據類型</b>、運算符和表達式的<b class='flag-5'>詳細資料</b>概述

    C語言程序設計教程之基本數據類型和運算符及表達式的資料說明

    本文檔詳細介紹的是C語言程序設計教程之基本數據類型和運算符及表達式的資料說明主要內容包括了:1
    發表于 01-25 15:44 ?0次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>程序設計教程之基本<b class='flag-5'>數據類型</b>和運算符及表達式的<b class='flag-5'>資料</b><b class='flag-5'>說明</b>

    C++入門教程之數據類型、運算符和表達式的詳細資料說明

    本文檔的詳細介紹的是C++入門教程之數據類型、運算符和表達式的詳細資料說明。主要內容包括了: 基本數據
    發表于 02-15 11:26 ?2次下載
    <b class='flag-5'>C</b>++入門教程之<b class='flag-5'>數據類型</b>、運算符和表達式的<b class='flag-5'>詳細資料</b><b class='flag-5'>說明</b>

    C語言教程之復雜數據類型及排序的詳細資料說明

    本文檔的主要內容詳細介紹的是C語言教程之復雜數據類型及排序的詳細資料說明目標包括了:1.定義結構
    發表于 02-21 14:25 ?3次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>教程之復雜<b class='flag-5'>數據類型</b>及排序的<b class='flag-5'>詳細資料</b><b class='flag-5'>說明</b>

    C++程序設計教程之數據類型詳細資料說明

    本文檔的主要內容詳細介紹的是C++程序設計教程之數據類型詳細資料說明。1. 整型 ( int Types ) , 2.整型子類 ( sub
    發表于 02-21 17:18 ?3次下載
    <b class='flag-5'>C</b>++程序設計教程之<b class='flag-5'>數據類型</b>的<b class='flag-5'>詳細資料</b><b class='flag-5'>說明</b>

    Java程序設計教程之數據類型及其運算的詳細資料說明

    本文檔的詳細介紹的是Java程序設計教程之數據類型及其運算的詳細資料說明主要內容包括了:1標識符和關鍵字 ,2常量和變量 ,3基本數據類型
    發表于 02-22 10:27 ?5次下載
    Java程序設計教程之<b class='flag-5'>數據類型</b>及其運算的<b class='flag-5'>詳細資料</b><b class='flag-5'>說明</b>

    C語言實用教程之數據類型運算符和表達式的詳細資料說明

    本文檔詳細介紹的是C語言實用教程之數據類型運算符和表達式的詳細資料說明主要內容包括了:1 一個簡
    發表于 02-26 14:45 ?10次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>實用教程之<b class='flag-5'>數據類型</b>運算符和表達式的<b class='flag-5'>詳細資料</b><b class='flag-5'>說明</b>

    C++程序設計教程之數據類型詳細資料說明

    本文檔詳細介紹的是C++程序設計教程之數據類型詳細資料說明主要內容包括了:1. 整型 ( int Types ) , 2.整型子類 ( s
    發表于 02-28 11:11 ?0次下載
    <b class='flag-5'>C</b>++程序設計教程之<b class='flag-5'>數據類型</b>的<b class='flag-5'>詳細資料</b><b class='flag-5'>說明</b>

    C語言教程之數據類型與運算符的詳細資料說明

    本文檔的主要內容詳細介紹的是C語言教程之數據類型與運算符的詳細資料說明主要內容包括了:
    發表于 03-01 17:20 ?8次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>教程之<b class='flag-5'>數據類型</b>與運算符的<b class='flag-5'>詳細資料</b><b class='flag-5'>說明</b>

    C++程序設計教程之數據類型與表達式的詳細資料說明

    本文檔的主要內容詳細介紹的是C++程序設計教程之數據類型與表達式的詳細資料說明包括了:1 . C
    發表于 03-14 14:48 ?0次下載
    <b class='flag-5'>C</b>++程序設計教程之<b class='flag-5'>數據類型</b>與表達式的<b class='flag-5'>詳細資料</b><b class='flag-5'>說明</b>

    C++程序設計教程之自定義數據類型詳細資料說明

    本文檔詳細介紹的是C++程序設計教程之自定義數據類型詳細資料說明主要內容包括了:1. 結構體類型
    發表于 03-14 16:04 ?1次下載
    <b class='flag-5'>C</b>++程序設計教程之自定義<b class='flag-5'>數據類型</b>的<b class='flag-5'>詳細資料</b><b class='flag-5'>說明</b>

    51單片機的基本數據類型詳細資料簡介

    本文檔的主要內容詳細介紹的是51單片機的基本數據類型詳細資料簡介。
    發表于 06-17 17:44 ?0次下載
    51單片機的基本<b class='flag-5'>數據類型</b><b class='flag-5'>詳細資料</b>簡介

    C51的數據類型詳細資料說明

    本文檔的主要內容詳細介紹的是C51的數據類型詳細資料說明包括了:基本數據類型
    發表于 07-11 08:00 ?2次下載

    C語言數據類型-2

    對于一個計算機程序,它所做的所有運算的本質都是數據的處理。但是數據的樣式并不單一,因此就有了各種各樣的數據類型。在C語言中,為了處理這些復雜
    的頭像 發表于 02-21 14:44 ?968次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>的<b class='flag-5'>數據類型</b>-2