程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++從零開始(三)何謂變量

C++從零開始(三)何謂變量

編輯:C++入門知識

本篇說明內容是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支持此類浮點類型則還是可以進行這個精度的計算。

  標准類型不止上面的幾個,後面還會陸續提到。

  上面的長度為2個字節也就是將兩個連續的內存單元中的數字取出並合並在一起以表示一個數字,這和前面說的一個算盤表示不了的數字,就進位以加入另一個算盤幫助表示是同樣的道理。

  上面的signed關鍵字是可以去掉的,即char等同於signed char,用以簡化代碼的編寫。但也僅限於signed,如果是unsigned char,則在使用時依舊必須是unsigned char。

  現在應該已經了解上篇中為什麼數字還要分什麼有符號無符號、長整型短整型之類的了,而上面的short、char等也都只是長度不同,這就由程序員自己根據可能出現的數字變化幅度來進行選用了。

  類型只是對內存中的數字的解釋,但上面的類型看起來相對簡單了點,且語義並不是很強,即沒有什麼特殊意思。為此,C++提供了自定義類型,也就是後繼文章中將要說明的結構、類等。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved