C++程序設計從零開始之何謂變量

轉自http://www.51edu.com/it/2009/0417/article_21692.html

   本篇說明內容是C++中的關鍵,基本大部分人對於這些內容都是昏的,但這些內容又是編程的基礎中的基礎,必須詳細說明。

  數字表示

  數學中,數只有數值大小的不同,絕不會有數值佔用空間的區別,即數學中的數是邏輯上的一個概念,但電腦不是。考慮算盤,每個算盤上有很多列算 子,每列都分成上下兩排算子。上排算子有2個,每個代表5,下排算子有4個,每個代表1(這並不重要)。因此算盤上的每列共有6個算子,每列共可以表示0 到14這15個數字(因爲上排算子的可能狀態有0到2個算子有效,而下排算子則可能有0到4個算子有效,故爲3×5=15種組合方式)。

  上面的重點就是算盤的每列並沒有表示0到14這15個數字,而是每列有15種狀態,因此被人利用來表示數字而已(這很重要)。由於算盤的每列有 15個狀態,因此用兩列算子就可以有15×15=225個狀態,因此可以表示0到224。阿拉伯數字的每一位有0到9這10個圖形符號,用兩個阿拉伯數字 圖形符號時就能有10×10=100個狀態,因此可以表示0到99這100個數。

  這裏的算盤其實就是一個基於15進制的記數器(可以通過維持一列算子的狀態來記錄一位數字),它的一列算子就相當於一位阿拉伯數字,每列有15 種狀態,故能表示從0到14這15個數字,超出14後就必須通過進位來要求另一列算子的加入以表示數字。電腦與此一樣,其並不是數字計算機,而是電子計算 機,電腦中通過一根線的電位高低來表示數字。一根線中的電位規定只有兩種狀態——高電位和低電位,因此電腦的數字表示形式是二進制的。

  和上面的算盤一樣,一根電線只有兩個狀態,當要表示超出1的數字時,就必須進位來要求另一根線的加入以表示數字。所謂的32位電腦就是提供了32根線(被稱作數據總線)來表示數據,因此就有2的32次方那麼多種狀態。而16根線就能表示2的16次方那麼多種狀態。
所以,電腦並不是基於二進制數,而是基於狀態的變化,只不過這個狀態可以使用二進制數表示出來而已。即電腦並不認識二進制數,這是下面“類型”一節的基礎。

  內存

  內存就是電腦中能記錄數字的硬件,但其存儲速度很快(與硬盤等低速存儲設備比較),又不能較長時間保存數據,所以經常被用做草稿紙,記錄一些臨時信息。

  前面已經說過,32位計算機的數字是通過32根線上的電位狀態的組合來表示的,因此內存能記錄數字,也就是能維持32根線上各自的電位狀態(就 好象算盤的算子撥動後就不會改變位置,除非再次撥動它)。不過依舊考慮上面的算盤,假如一個算盤上有15列算子,則一個算盤能表示15的15次方個狀態, 是很大的數字,但經常實際是不會用到變化那麼大的數字的,因此讓一個算盤只有兩列算子,則只能表示225個狀態,當數字超出時就使用另一個或多個算盤來一 起表示。

  上面不管是2列算子還是15列算子,都是算盤的粒度,粒度分得過大造成不必要的浪費(很多列算子都不使用),太小又很麻煩(需要多個算盤)。電 腦與此一樣。2的32次方可表示的數字很大,一般都不會用到,如果直接以32位存儲在內存中勢必造成相當大的資源浪費。於是如上,規定內存的粒度爲8位二 進制數,稱爲一個內存單元,而其大小稱爲一個字節(Byte)。就是說,內存存儲數字,至少都會記錄8根線上的電位狀態,也就是2的8次方共256種狀 態。所以如果一個32位的二進制數要存儲在內存中,就需要佔據4個內存單元,也就是4個字節的內存空間。

  我們在紙上寫字,是通過肉眼判斷出字在紙上的相對橫座標和縱座標以查找到要看的字或要寫字的位置。同樣,由於內存就相當於草稿紙,因此也需要某 種定位方式來定位,在電腦中,就是通過一個數字來定位的。這就和旅館的房間號一樣,內存單元就相當於房間(假定每個房間只能住一個人),而前面說的那個數 字就相當於房間號。爲了向某塊內存中寫入數據(就是使用某塊內存來記錄數據總線上的電位狀態),就必須知道這塊內存對應的數字,而這個數字就被稱爲地址。 而通過給定的地址找到對應的內存單元就稱爲尋址。

  因此地址就是一個數字,用以唯一標識某一特定內存單元。此數字一般是32位長的二進制數,也就可以表示4G個狀態,也就是說一般的32位電腦都 具有4G的內存空間尋址能力,即電腦最多裝4G的內存,如果電腦有超過4G的內存,此時就需要增加地址的長度,如用40位長的二進制數來表示。

  類型

  在本系列最開頭時已經說明了何謂編程,而剛纔更進一步說明了電腦其實連數字都不認識,只是狀態的記錄,而所謂的加法也只是人爲設計那個加法器以 使得兩個狀態經過加法器的處理而生成的狀態正好和數學上的加法的結果一樣而已。這一切的一切都只說明一點:電腦所做的工作是什麼,全視使用的人以爲是什 麼。

  因此爲了利用電腦那很快的“計算”能力(實際是狀態的變換能力),人爲規定了如何解釋那些狀態。爲了方便其間,對於前面提出的電位的狀態,我們 使用1位二進制數來表示,則上面提出的狀態就可以使用一個二進制數來表示,而所謂的“如何解釋那些狀態”就變成了如何解釋一個二進制數。

  C++是高級語言,爲了幫助解釋那些二進制數,提供了類型這個概念。類型就是人爲制訂的如何解釋內存中的二進制數的協議。C++提供了下面的一些標準類型定義。

  ·signed char 表示所指向的內存中的數字使用補碼形式,表示的數字爲-128到+127,長度爲1個字節

  ·unsigned char 表示所指向的內存中的數字使用原碼形式,表示的數字爲0到255,長度爲1個字節

  ·signed short 表示所指向的內存中的數字使用補碼形式,表示的數字爲–32768到+32767,長度爲2個字節

  ·unsigned short 表示所指向的內存中的數字使用原碼形式,表示的數字爲0到65535,長度爲2個字節

  ·signed long 表示所指向的內存中的數字使用補碼形式,表示的數字爲-2147483648到+2147483647,長度爲4個字節

  ·unsigned long 表示所指向的內存中的數字使用原碼形式,表示的數字爲0到4294967295,長度爲4個字節

  ·signed int 表示所指向的內存中的數字使用補碼形式,表示的數字則視編譯器。如果編譯器編譯時被指明編譯爲在16位操作系統上運行,則等同於signed short;如果是編譯爲32位的,則等同於signed long;如果是編譯爲在64位操作系統上運行,則爲8個字節長,而範圍則如上一樣可以自行推算出來。

  ·unsigned int 表示所指向的內存中的數字使用原碼形式,其餘和signed int一樣,表示的是無符號數。

  ·bool 表示所指向的內存中的數字爲邏輯值,取值爲false或true。長度爲1個字節。

  ·float 表示所指向的內存按IEEE標準進行解釋,爲real*4,佔用4字節內存空間,等同於上篇中提到的單精度浮點數。

  ·double 表示所指向的內存按IEEE標準進行解釋,爲real*8,可表示數的精度較float高,佔用8字節內存空間,等同於上篇提到的雙精度浮點數。

  ·long double 表示所指向的內存按IEEE標準進行解釋,爲real*10,可表示數的精度較double高,但在爲32位Windows操作系統編寫程序時,仍佔用8 字節內存空間,等效於double,只是如果CPU支持此類浮點類型則還是可以進行這個精度的計算。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章