- 程序員修煉之道:程序設計入門30講
- 呂云翔 傅義主編
- 2568字
- 2019-08-08 18:36:04
3.什么是數據類型?
對初學者來說,理解數據類型可能是一個難題。我們已經知道int代表整數,char代表字符,float代表浮點數,但是這些數據類型在內存中是如何存儲的?數據類型對于計算機有什么意義?我們還不是十分清楚。
有些人的觀點是,理解數據類型是一個循序漸進的過程,一開始的不理解并不會阻礙初學者打好編程基礎,隨著編寫的代碼越來越多,再來學習內存的知識,會更加容易。我也十分認同這種觀點,數據類型及內存方面的知識不是一下可以吃透的,但如果讀者仍充滿了好奇,堅持要理解數據類型,閱讀本節也是一個不錯的選擇。
定義
在開始進入本節的學習之前,讓我們先來看一下數據類型的定義,盡管定義可能有些枯燥:數據類型在數據結構中的定義是一個值的集合以及定義在這個值集上的一組操作。變量是用來存儲值的所在處,它們有名字和數據類型。變量的數據類型決定了如何將代表這些值的位存儲到計算機的內存中。在聲明變量時也可指定它的數據類型。所有變量都具有數據類型,以決定能夠存儲哪種數據。
位、字節、字
從數據類型的定義可以看出,數據類型解決的是變量存儲的問題。要理解數據類型,首先需要了解計算機是如何存儲數據的。我們都知道,計算機的世界是二進制的,僅僅用0和1就構建了所有的表達,計算機用來存儲0或者1的單位是位(bit),8個位組成一個字節(byte),位和字節的定義如圖3.1所示。

圖3.1 位和字節
位:表示二進制位。位是計算機內部數據存儲的最小單位,一個二進制位只可以表示0和1兩種狀態;兩個二進制位可以表示00、01、10、11四種狀態;三個二進制位可以表示八種狀態。
字節:計算機中數據存儲的基本單位。一個字節由8個二進制位構成。八位二進制數最小為00000000,最大為11111111,可以表示256種狀態;通常一個字節可以存入一個ASCII碼,兩個字節可以存放一個漢字國標碼。
字:在計算機中,一個固定長度的位組作為一個整體來處理或運算,稱為一個計算機字,簡稱字。字通常分為若干個字節,其長度用位數表示,常見的有16位、32位、64位等。字長越長,計算機一次處理的信息位越多、精度越高,字長是衡量計算機性能的一個重要指標。
綜上所述,計算機通過對每一位賦予不同的值(0或1)來存儲不同的信息,一個字節可以表示256種狀態。以ASCII碼為例,它一共定義了128個字符的編碼,因此只需要占用一個字節的后7位就可以表示所有這128種不同的狀態,最前面的1位就統一規定為0。
理解數據類型
示例代碼3.1

為了理解數據類型,我們首先來閱讀示例代碼3.1。在該段代碼中,首先定義了一個char類型的數組s,該數組共有兩個元素,分別是'A'和'B'。C++中,char類型占一個字節,其中,數組第一個元素'A'的ASCII碼值為65(對應的二進制表示為01000001),數組第二個元素'B'的ASCII碼值為66(對應的二進制表示為01000010),數組的元素在內存中連續存放,因此數組s在內存中的存儲方式如圖3.2所示。

圖3.2 數組s在內存中的存儲方式
現在我們知道,內存中存在連續的兩個字節存放著數組s,這兩個字節的內容是01000001和01000010?;氐绞纠a3.1,在第6行,我們定義了一個短整型指針,指針的值是數組s的地址,也就是數組s第一個元素的地址,在筆者的編譯環境中,short類型占兩個字節。讀者也許還不理解指針是什么意思,接著看示例代碼3.1第7行,我們將指針所指的內容打印到屏幕。結合看第6行和第7行代碼,我們做的其實是將數組s所占用的兩個字節的內容看成是存放著一個short類型的值,然后將這個值輸出到屏幕,由于筆者運行代碼的CPU采用小端序存儲,即低地址存放低位值,高地址存放高位值,因此輸出的short類型的值為16961(16961=66×256+65)。關于大端序、小端序的知識,讀者可以參考本節最后部分。
通過這個例子,讀者應該已經發現數據類型的作用了。對于內存中存放的兩個字節的內容,計算機可以將其理解為兩個char類型的值,也可以將其理解為一個short類型的值,我們需要告訴計算機如何去解析內存中存放的內容,如何去告訴呢?這正是數據類型要完成的任務。當我們定義了一個char類型的變量時,計算機在分配內存給變量的時候同時記住了這片內存中存放的是怎樣一類數據。再舉一個例子,對于一個字節的內容01000001,計算機可以將其理解為一個byte類型的值,即65,也可以將其理解為一個char類型的值,即'A'。
C++中的基本數據類型
在理解了數據類型之后,我們先看一下C++中的基本數據類型。C++中定義了一組表示整數、浮點數、單個字符和布爾值的算術類型,算術類型的存儲空間依機器而定。這里的存儲空間是指用來表示該類型的二進制位數。C++標準規定了每個算術類型的最小存儲空間,但它并不阻止編譯器使用更大的存儲空間。因為位數不同,這些類型所能表示的最大值和最小值也因機器的不同而有所不同。表3.1列舉了C++中各種基本數據類型,包括占用的空間大?。–++標準規定的最小存儲空間)以及取值范圍。
表3.1 C++中的各種基本數據類型

Java中的基本數據類型
Java的基本數據類型區別于C++的基本數據類型的地方是,Java中的基本數據類型所占的存儲空間是固定的,不會因為機器的不同而不同,這是因為Java程序運行在JVM(Java Virtual Machine)之上,從而使得運行環境與平臺無關。
Java基本類型共有8種,可以分為三類,字符類型char,布爾類型boolean以及數值類型byte、short、int、long、float、double。Java中的數值類型不存在無符號的,且取值范圍是固定的。實際上,Java中還存在另外一種基本類型void,不過我們無法直接對它們進行操作。表3.2列舉了Java中的8種基本數據類型,包括占用的空間大小以及取值范圍。

大端序與小端序
字節序又稱端序、尾序。在計算機科學領域中,字節序是指存放多字節數據的字節的順序。如果數據都是單字節的,那就無所謂數據內部的字節順序了;但是對于多字節數據,比如int、double等,就要考慮數據內部字節的順序了。常見字節序包括以下兩種:
(1)大端序:數據的高位字節存放在低地址端,低位字節存放在高地址端。
(2)小端序:數據的高位字節存放在高地址端,低位字節存放在低地址端。
為了直觀地理解字節序,我們以一個long類型的數據為例,查看該數據在不同字節序中存儲的方式。現在定義一個long類型數據0x12345678(十六進制表示,關于進制的知識讀者可以參考第4節),該數據在內存中一共占用了4字節。
在大端序存儲數據的機器中,該數據從內存低地址到內存高地址的四個字節分別存放的值為0x12、0x34、0x56、0x78,如表3.3所示。而在小端序存儲數據的機器中,該數據從內存低地址到內存高地址的4字節分別存放的值為0x78、0x56、0x34、0x12,如表3.4所示。
表3.3 大端序數據存儲方式

表3.4 小端序數據存儲方式

- Spring 5.0 Microservices(Second Edition)
- Java完全自學教程
- 編程珠璣(續)
- MongoDB,Express,Angular,and Node.js Fundamentals
- ElasticSearch Cookbook(Second Edition)
- Python語言實用教程
- Scratch3.0趣味編程動手玩:比賽訓練營
- Extending Unity with Editor Scripting
- C語言程序設計實踐
- ABAQUS6.14中文版有限元分析與實例詳解
- DB2SQL性能調優秘笈
- 青少年Python趣味編程
- Swift 2 Design Patterns
- Apache Kafka 1.0 Cookbook
- 深入實踐C++模板編程