2.1 數據的表示方法
計算機的存儲系統由內存和外存組成。內存又可分為RAM(隨機存儲器)和ROM(只讀存儲器)。RAM內存用于暫時存放運行的程序和所需數據,一旦關閉電源或發生斷電,其中的程序和數據就會丟失。為了便于管理,通常將8位(bit)組成一個基本的內存單元,稱為1字節(Byte)。也就是說,一個基本內存單元的大小是1字節。為了便于內存單元的訪問,計算機系統還為每一個內存單元分配了一個相對固定的編碼,這個編碼就是內存單元的內部“地址”。
在介紹C語言的數據類型之前,有必要在這里先來討論數據的表示方法。
2.1.1 進制的概念
前面說過,計算機內部的信息在內存中都是以二進制形式存放的。那么,什么是進制呢?
1.進制的表示
在計數中,將數字符號按序排列成數位,并遵照某種由低位到高位進位的方法進行計數,來表示數值的方式,稱為進位計數制,簡稱進制。比如,日常生活使用最多的是十進位計數制,簡稱十進制,就是按照“逢十進一”的原則進行計數的。進制的表示主要包含3個基本要素:數位、基數和位權。
數位是指數碼在一個數中所處的位置。
基數是指在某種進位計數制中,每個數位上所能使用的數碼的個數,例如,十進位計數制中,每個數位上可以使用的數碼為0,1,2,3,…,9十個數碼,即基數為10。
位權是一個固定值,是指在某種進位計數制中,每個數位上的數碼所代表的數值的大小,等于在這個數位上的數碼乘上一個固定的數值,這個固定的數值就是這種進位計數制中該數位上的位權,即基數的冪次方。數碼所處的位置不同,代表數的大小也不同。各位上的權的定義為:小數點左邊,從右向左分別是基數的0次方,1次方,……,n次方;小數點右邊,從左向右分別是基數的-1次方,-2次方,……,-n次方。
2.十進制
十進位計數制簡稱十進制;有10個不同的數碼符號:0,1,2,3,4,5,6,7,8, 9。每個數碼符號根據它在這個數中所處的位置(數位),按“逢十進一”來決定其實際數值,即各數位的位權是以10為底的冪次方。例如:
(273.15)10=2×102+7×101+3×100+1×10-1+5×10-2
3.二進制
二進位計數制簡稱二進制,有兩個不同的數碼符號:0,1。每個數碼符號根據它在這個數中所處的位置(數位),按“逢二進一”來決定其實際數值,即各數位的位權是以2為底的冪次方。例如:
(11001.01)2=1×24+1×23+0×22+0×21+1×20+0×2-1+1×2-2=(25.25)10
4.八進制
八進位計數制簡稱八進制,有8個不同的數碼符號:0,1,2,3,4,5,6,7。每個數碼符號根據它在這個數中所處的位置(數位),按“逢八進一”來決定其實際數值,即各數位的位權是以8為底的冪次方。例如:
(162.4)8=1×82+6×81+2×80+4×8-1=(114.5)10
5.十六進制
十六進位計數制簡稱十六進制,有16個不同的數碼符號:0,1,2,3,4,5,6,7, 8,9,A,B,C,D,E,F。其中,A,B,C,D,E,F分別表示十進制中的10,11, 12,13,14和15。在十六進制中,每個數碼符號根據它在這個數中所處的位置(數位),按“逢十六進一”來決定其實際數值,即各數位的位權是以16為底的冪次方。例如:
(2BC.48)16=2×162+B×161+C×160+4×16-1+8×16-2=(700.28125)10
總結以上4種進位計數制,可以將它們的特點概括為:每一種計數制都有一個固定的基數,每一個數位可取基數中的不同數值;每一種計數制都有自己的位權,并且遵循“逢基數進一”的原則。
2.1.2 原碼、反碼和補碼
在計算機內部,所有的信息都要用二進制數來表示,這個二進制數就稱為機器數。不考慮正、負的機器數稱為無符號數。考慮正、負的機器數稱為有符號數。為了在計算機中正確地表示有符號數,通常規定最高位為符號位,并用0表示正,用1表示負,余下各位表示數值。這種把符號數字化,并和數值位一起編碼的辦法,很好地解決了帶符號數的表示方法及其計算問題。對于整數來說,常用的有原碼、反碼、補碼3種。
1.原碼
機器數本身就是原碼表示法。例如:若位長為8,數值125的原碼表示法為(01111101)2;因為125轉化成二進制數為(1111101)2,占7位,最高位是符號位,正數用0表示,如圖2.1所示(圖中每一格表示1位)。

圖2.1 125的原碼表示法(8位)
類似地,數值-125的原碼表示則應為(11111101)2,因為最高位是符號位,負數用1表示。
2.反碼
正數的反碼就是它的原碼,負數的反碼是將除符號位以外的各位取反得到的。例如:
[125]反=[125]原=01111101 [-125]原=11111101 [-125]反=10000010
3.補碼
正數的補碼就是它的原碼,負數的補碼是將它的反碼在末位加1得到的。例如:
[125]補=[125]原=01111101
[-125]原=11111101 [-125]反=10000010 [-125]補=10000011
需要說明的是,對于整數來說,在計算機內都是用補碼來存儲的。
2.1.3 非數值信息的編碼
計算機除了用于數值計算之外,還要進行大量的文字信息處理,也就是要對各種文字信息的符號進行表達。這些非數值數據在計算機內中采用這樣的方法表示:
(1)使用由若干位組成的二進制數來表示一個符號;
(2)一個二進制數只能與一個符號唯一對應,即符號集內所有的二進制數不能相同。
這樣,二進制數的位數將取決于符號集的規模。例如:128個符號的符號集需要7位二進制數;256個符號的符號集則需要8位的二進制數,這就是字符編碼。下面介紹幾種常見的編碼。
1.ASCII碼
ASCII(American Standard Code for Information Interchange)碼是美國標準信息交換代碼的簡稱,用于給西文字符編碼。這種編碼由7位二進制數組合而成,可以表示128個字符,目前在國際上廣泛流行。
ASCII碼是7位二進制編碼,而計算機的基本存儲單位是字節(Byte),1字節包含8個二進制位(bit)。因此,ASCII碼的機內碼要在最高位補一個0。后來,IBM公司把ASCII碼的位數增加1位,用8位二進制數構成一個字符編碼,共有256個符號。擴展后的ASCII碼除了原先的128個字符之外,又增加了一些常用的科學符號和表格線條。附錄B中表B.1和表B.2分別列出了ASCII碼字符集的基本字符和擴展字符。
2.漢字編碼GB 2312—80
我國國家標準總局于1981年頒布了《中華人民共和國國家標準信息交換用漢字編碼》(GB 2312—80)。該標準收錄了漢字、圖形、符號等共7445個,并根據漢字的常用程度確定了一級和二級漢字字符集。這么多的漢字都必須用不同的二進制數表示,1字節顯然不夠,所以采用了稱為GB碼的編碼方式。字符集中的任何一個漢字或符號都用兩個7位二進制數表示,在計算機中占2字節,并將每個字節的最高位常常置為1。
3.ISO/IEC 10646,Unicode編碼
ISO/IEC 10646即通用多8位編碼字符集(Universal Multiple-Octet Coded Character Set, UCS)的國際標準,用于世界上各種語言、符號的數字形式的表示、傳輸、交換、處理、存儲輸入及展現。它與Unicode組織的Unicode編碼(統一的字符編碼標準,采用雙字節對字符進行編碼)完全兼容。
顯然,計算機對于ASCII、漢字等非數值數據,是用其二進制編碼來存儲的。
- Android應用程序開發與典型案例
- Java Web開發之道
- ASP.NET Core 2 and Vue.js
- Learn Swift by Building Applications
- HTML5+CSS3網頁設計
- Microsoft Azure Storage Essentials
- Swift 4 Protocol-Oriented Programming(Third Edition)
- Swift 4從零到精通iOS開發
- 編寫高質量代碼:改善Objective-C程序的61個建議
- 運維前線:一線運維專家的運維方法、技巧與實踐
- .NET 4.5 Parallel Extensions Cookbook
- Python大學實用教程
- C語言程序設計
- WCF技術剖析(卷1)
- C語言程序設計教程