相關的環境准備好后就可以正式學習C++語言了, 今天要學習的內容為:
1. +C++基本數據類型
-整形
-浮點型
-字符型
-布爾型
2. +變量:
-變量名命名規則
-整型變量
-浮點型變量
-字符型變量
-布爾型變量
3. +常量:
-整型常量
-浮點型常量
-字符型常量
-字符串常量
-符號常量
4. +運算符
-算術運算
-關系運算
-邏輯運算
-賦值運算
-條件運算
-運算符的優先級和結合性
------------------
1.什么是數據類型?
我們知道, 在數學中, 數字有正數、負數、整數、小數等分類, 在計算機中我們自然要處理數字, 因此也要使用相應的類型來表示這些數學上的數字類型, 首先看一下數學上的整數:
數學上的整數在C++中用 int 進行表示,而小數用 float 或 double 進行表示, 在這些類型前面還可以加一些修飾符進行更具體的描述, 比如long:長、short:短、signed:有符號、unsigned:無符號等。 要知道, 計算機不僅僅能處理數字, 還能夠處理字符, 所以還有相應的字符變量char 或 wchar_t,下面我們用張表格表示下剛才提到的數據類型, 這里先不去講解如何使用這些符號去定義數據類型, 等講解完變量后再去詳細的講解這部分的內容, 這里只需要有個印象即可。
表示數字 | 表示字符 | 布爾型 |
int -> 整型 | char -> 單字節字符 | bool (真或假) |
float -> 浮點型(單精度型) | wchar_t -> 雙字節字符 | |
double -> 浮點型(雙精度型) |
2.什么是變量?
術語解釋: 在計算機的內存中, 內存被划分為一個一個的內存單元, 每個內存單元有自己的編號, 而變量就是對某一段連續內存單元使用一些更容易記憶、更容易區分的字符組合為其建立一個新的名稱。
形象解釋: 內存就像一棟很高的大樓, 在這棟高樓里有許多的小房間, 我們為每個房間都進行了編號, 這些房間的用處有很多, 可以住人、放東西、還可以把許多房間砸穿連在一起做成一個室內籃球場(如果不是豆腐工程的話)。
當這些房間中用了很多之后, 比如, 928號房間被小明同學住了, 736號房間被小李同學住了, 從1826號房間到1930號這些房間被某公司租下來當做辦公室了, 2306號房間到2413號房間被砸穿用來做籃球場, 諸如此類, 如果我們現在要給這棟樓中放東西或者從中取東西, 隨筆找個房間放? 那是不可能的, 有些房間是已經被別人使用了, 怎么辦? 幸運的是這棟大樓有位十分厲害的門衛, 他能清楚的記住哪些房間已經被使用, 哪些房間沒有被使用, 我們只要把需要存放的東西交給他, 他自然能夠幫你找到合適的位置存放, 然后他再把存放房間的編號給訴你, 等你需要取時再告訴他房間的編號讓他幫你取出來, 當存放僅僅幾件東西時這還沒什么問題, 但當存放的東西太多時, 問題就來了, 現在我們手里已經有很多編號, 但是嚴重的是我們忘記哪個編號存放的是金條了, 可是我們明明已經存進去了, 忘記了編號就無法取出金條, 哭吧...
為了解決這個問題, 后來, 門衛又請來一位幫手, 負責登記存放的物品, 並且允許用戶對存放的房間起一個新的名字, 起名的原則就是自己使用的名字不能重復, 一間/連續的幾間房間對應一個名字, 但可以與其他用戶的房間重名。 這樣, 我們再存放物品時就方便多了, 比如我們要把這雙拖鞋存進去, 告訴門衛的助手, "把這雙拖鞋存進去, 房間的名字就叫 '超大號拖鞋'", 下次你再去取時完全不用關心房間的編號, 只需要告訴門衛的助手, 幫我取出那雙'超大號拖鞋', 門衛的助手抬頭一看, 噢~ 是程旭源來了, 那就取出屬於程旭源的'超大號拖鞋', 不會取出其他人的'超大號拖鞋', 這樣就確保了物品在大樓里的安全性。
術語與比喻結合: 內存單元就相當於大樓的房間, 門衛就相當於操作系統, 而門衛的助手就相當於編譯器, 這個"起名的原則就是自己使用的名字不能重復, 一間/連續的幾間房間對應一個名字, 但可以與其他用戶的房間重名。"原則在C++被稱為"命名空間"機制。之所以要給內存起名就是為了方便記憶這個內存單元中我們存放的是什么東西, 便於以后的取出。
2.1 變量名命名規則
在上面關於變量的解釋已經初步的說了一點, 不能與已經使用過的名字相同, 此外還有以下兩點:
①. 由字母(a-z, A-Z)、數字(0-9)或下划線(_)組成;
②. 第一個字符必須是字母或下划線;
③. 區分大小寫, 例如A和a編譯器會認為是不同的變量名;
④. 標示符不能是C++的關鍵字.
補充講解: C++的關鍵字
C++的關鍵字是指C++語言本身已經使用了的有特定意思的字符, 例如在上面提到的int、float、double、char、wchar_t、short、long、signed、unsigned這些都不能再作為變量名, C++關鍵字整理:
and | and_eq | asm | auto | bitand | bitor | bool | break |
case | catch | char | class | compl | const | const_cast | continue |
default | delete | do | double | dynamic_cast | else | enum | explicit |
export | extern | false | float | for | friend | goto | if |
inline | int | long | mutable | namespace | new | not | not_eq |
operator | or | or_eq | private | protected | public | register | reinterpret_cast |
return | short | signed | struct | sizeof | static | static_cast | throw |
switch | template | this | typeid | true | try | typedef | using |
typename | union | unsigned | virtual | void | volatile | wchar_t | while |
xor | xor_eq |
提示: 表格中的顏色沒有任何含義, 純色容易使眼睛疲勞, 用三種顏色表示僅僅是為了看起來不那么刺眼。
對於這些關鍵字我們現在沒有任何必要去強行記住它, 隨着學習的進行我們自然都會認識他們。
2.2 整型變量
聲明一個整型變量的語法:
int 變量名 ;
還可以一次聲明多個int型變量:
int 變量名1, 變量名2, 變量名3, ..., 變量名n ;
例如, 聲明一個整型變量a:
int a ;
此時, a字符就代表着一個int型變量.
2.3 浮點型變量
浮點型變量可用float或double表示, float和double的區別就在於double型的變量比float表示的數據范圍要大, 那么到底大多少呢? 稍后我們統一的講解。
定義一個float型的變量:
float 變量名 ;
同樣, 也可能一次聲明多個float型變量:
float 變量名1, 變量名2, 變量名3, ..., 變量名n ;
例如:
float b ;
此時, b字符就代表着一個float型變量.
聲明一個double型的變量:
double 變量名 ;
一次聲明多個double型變量:
double 變量名1, 變量名2, 變量名3, ..., 變量名n ;
怎么樣? 是不是很有規律?
聲明一種數據類型的格式就是:
數據類型 變量名1個或多個 ;
記住, 聲明完成后不要忘記加上最后面的分號(;)。
2.4 字符型變量
字符型變量分為基本字符型變量char與寬字符型變量wchar_t, 對於char 與wchar_t的區別見文章最后部分的"提高部分".
根據總結出來的定義變量的格式, 那么, 定義一個char型字符變量就是:
char 變量名一個或多個 ;
定義一個wchar_t型字符變量就是:
wchar_t 變量名一個或多個 ;
2.5 布爾型變量
布爾型數據只有兩個值, true(真) 或 false(假), 其中true和flase都是C++的關鍵字, 那么, 什么是真, 什么是假呢? C++認為, 一個值只要不是0, 那么這個值就是真(true), 值為0就是假(false).
定義一個布爾型數據:
bool 變量名一個或多個.
到這里我們來總結下已經知道的變量類型以及這個變量能表示的取值范圍, 需要注意的是, 這里的int 和unsigned int取值范圍根據編譯器決定的, 這點一定要清楚.
數據類型 | 取值范圍 |
int | 與編譯器有關 |
unsigned [int] | 與編譯器有關 |
short [int] | -32768 ~ 32768 |
long [int] | -2147483648 ~ 2147483647 |
signed [int] | 同int |
signed short [int] | 同short int |
signed long [int] | 同long int |
unsigned short [int] | 同unsigned int |
unsigned long [int] | 0 ~ 4294967295 |
float | -3.4e-38 ~ 3.4e38 小數位6位 |
double | -1.7e-308 ~ 1.7e308 小數位15位 |
說明: 表格中用中括號[]括起來的int是指在使用時可以省略的意思, 例如定義一個無符號型變量n, 用 unsigned n ; 與 unsigned int n ; 的效果是相同的, 但不建議省略。
如果數字超過了這個范圍就會產生錯誤(溢出)。
在較新的編譯器上, 例如我們現在使用的GCC編譯器, int型數據的范圍為-2147483648 ~ 2147483647。
2.什么是常量?
常量是指程序在運行時其值不能改變的量。
2.1 整型常量
C++提供了三種進制對常量進行描述, 分別是八進制、十進制、十六進制:
①. 用八進制描述整型常量:
八進制由數字0-7組成, 滿八進一, 用八進制描述一個整型常量用數字0作為前綴:
例如:
十進制的10用八進制描述: 012
十進制的16用八進制描述: 020
十進制的20用八進制描述: 024
②. 用十進制描述整型常量:
十進制由數字0-9組成, 滿十進一, 用十進制描述整型常量同我們平時使用的十進制.
例如:
十進制的8: 8
十進制的16: 16
十進制的20: 20
③. 使用十六進制描述整型常量:
十進制由數字0-9、a-f或A-F(不區分大小寫)組成, 滿十進一, 用十六進制描述整型常量常量用0x作為前綴.
例如:
十進制的10用十六進制描述: 0xA
十進制的16用十六進制描述;0x10
十進制的20用十六進制描述: 0x14
2.2 浮點型常量
浮點型常量與數學上的用法相同, 有兩種表示方式: 一種是常規的計數法, 另一種是科學計數法:
1>. 常規計數法: 整數部分.小數部分
例如: 1.7、2.65、18.375
2>. 科學計數法:
由 整數部分.小數部分e或E指數部分組成
例如:
1.7x10的23次方表示為: 1.7e23
4x10的17次方表示為: 4e17
0.8的負5次方表示為: 0.8e-5
說明: C++可以使用后綴聲明一個整型常量或浮點型常量的長度, 可以使用的后綴有L(l):長的, U(u):無符號的, F(f):浮點型的, 這里不區分大小寫, 建議大寫。
例如;
聲明一個整型常量為long的整型, 1000L
聲明一個long double型的常量: 1.2L
聲明一個unsigned long int型的常量: 1024UL
未加后綴區分的整型常數一律默認為int型, 未加后綴區分的浮點型一律默認為double型, 浮點常數只能用十進制表示。
2.3 字符常量
字符常量用一對單引號('')括起來的一個或多個字符稱為字符常量, 例如'A'、'BC'、'#'、'\n'(轉義符)、'6'等, 其中'A'、'#'、'6'稱為單字符常量, 'BC'稱為雙字符常量, '\n'為轉義符。
對於雙字符常量, 編譯器將其解釋為一個unsigned short int型。
何謂轉義符?
轉義符有自己的特殊含義, 它告訴編譯器這些字符需要用特殊的方式進行處理, C++中的轉義符:
轉義字符 | 描述 |
\’ |
單引號 |
\” |
雙引號 |
\\ |
反斜杠 |
\0 |
空字符(NUL) |
\ooo |
o代表一位八進制數 |
\a |
響鈴符 |
\b | 退格符 |
\f |
換頁符 |
\n |
換行符 |
\r | 回車符 |
\t | 水平制表符 |
\v | 垂直制表符 |
\xhh | h代表一位十六進制 |
這些轉義符的具體用法我們到講輸出語句時再介紹。
2.4 字符串常量
字符串常量是指用一對雙引號括起來的零個或多個ASCII字符的序列, 並以NULL(0)結束的字符串, 例如"Hello, world!"就是一個字符串常量。
更多關於字符串的介紹將在以后的學習中進行。
2.5 符號常量:
用一個標識符來表示一個常量,稱之為符號常量。
符號常量的定義形式:
#define 標識符 常量
#define是一條預處理命令, 稱為宏定義命令, 其功能是把該標識符定義為其后的常量值。一經定義, 以后在程序中所有出現該標識符的地方均代之以該常量值。
例如:
#define PI 3.14
定義PI符號常量為值3.14, 以后在代碼中出現"PI"字符的地方就代表着數值3.14。
3. 運算符
C++提供了以下幾種運算符:
3.1 算術運算:
+ (加)
- (減)
* (乘)
/ (除)
% (取余)
- (取負)
說明: 當兩數均為整型且被除數不為0才可進行取余運算。
3.2 關系運算:
關系運算, 又稱比較運算, C++提供了6種關系運算:
> 大於
< 小於
= 等於
>= 大於等於
<= 小於等於
== 等於(兩個=號)
!= 不等於
3.3 邏輯運算:
邏輯運算符是根據表達式的值來返回真值或是假值。
運算符 | 名稱 | 說明 |
&& | 邏輯與 | 同為真返回真 |
|| | 邏輯或 | 有一真返回真 |
! | 邏輯非 | 值為真返回假, 值為假返回真 |
3.4 賦值運算:
賦值語句的作用是把某個常量或變量或表達式的值賦值給另一個變量或左值表達式, 賦值符號為'='。
注意: 與等於符號(==)區分, 賦值是一個等號=, 而相等為兩個等號。
等號左邊的變量或左值表達式稱為左值, 產生值的表達式我們稱為右值, 常數只能作為右值。
例如:
i = 10 ; a = b = 0 ;
第一個的含義為將常量10賦值給變量i, 第二個賦值語句的意思是把0同時賦值給兩個變量。
3.5 條件運算:
條件運算符的格式為:
邏輯表達式?表達式1:表達式2
在該運算中, 首先對邏輯表達式進行運算, 如果為真, 則返回表達式1的值; 如果為假, 則返回表達式2的值。
例如;
a = 10 ; b = 20 ; max = a > b ? a : b ;
因為a不大於b, 所以邏輯表達式的值為假, 因此返回表示式2的值, 即將b的值賦值給max。
3.6 運算符的優先級和結合性
在數學中, 我們知道, 先算乘除、再算加減, 若有括號先算括號里面的, 同樣, 在C++中的運算符也有自己的優先級, 在多個運算符同時出先在同一表達式中程序將根據運算符的優先級決定先計算誰后計算誰。
運算符的結合性又稱為運算流向, 它決定組成表達式的各個部分的計算流向。
比如在
n = a / b ;
中, 賦值運算的優先級低於加(+)號的優先級, 因此要先算a / b部分, 加(+)號的結合性為自左向右, 所以a是被除數, b是除數。
C++中一些基本運算符的結合性與優先級如下:
優先級 |
運算符 |
名稱或含義 |
使用形式 |
結合方向 |
說明 |
1(最高) |
[] |
數組下標 |
數組名[常量表達式] |
左到右 |
|
() |
圓括號 |
(表達式)/函數名(形參表) |
|||
. |
成員選擇(對象) |
對象.成員名 |
|||
-> |
成員選擇(指針) |
對象指針->成員名 |
|||
2 |
- |
負號運算符 |
-表達式 |
右到左 |
單目運算符 |
(類型) |
強制類型轉換 |
(數據類型)表達式 |
|||
++ |
自增運算符 |
++變量名/變量名++ |
單目運算符 |
||
-- |
自減運算符 |
--變量名/變量名-- |
單目運算符 |
||
* |
取值運算符 |
*指針變量 |
單目運算符 |
||
& |
取地址運算符 |
&變量名 |
單目運算符 |
||
! |
邏輯非運算符 |
!表達式 |
單目運算符 |
||
~ |
按位取反運算符 |
~表達式 |
單目運算符 |
||
sizeof |
長度運算符 |
sizeof(表達式) |
|||
3 |
/ |
除 |
表達式/表達式 |
左到右 |
雙目運算符 |
* |
乘 |
表達式*表達式 |
雙目運算符 |
||
% |
余數(取模) |
整型表達式/整型表達式 |
雙目運算符 |
||
4 |
+ |
加 表達式+表達式 |
左到右 |
雙目運算符 |
|
- |
減 |
表達式-表達式 |
雙目運算符 |
||
5 |
<< |
左移 |
變量<<表達式 |
左到右 |
雙目運算符 |
>> |
右移 |
變量>>表達式 |
雙目運算符 |
||
6 |
> |
大於 |
表達式>表達式 |
左到右 |
雙目運算符 |
>= |
大於等於 |
表達式>=表達式 |
雙目運算符 |
||
< |
小於 |
表達式<表達式 |
雙目運算符 |
||
<= |
小於等於 |
表達式<=表達式 |
雙目運算符 |
||
7 |
== |
等於 |
表達式==表達式 |
左到右 |
雙目運算符 |
!= |
不等於 |
表達式!= 表達式 |
雙目運算符 |
||
8 |
& |
按位與 |
表達式&表達式 |
左到右 |
雙目運算符 |
9 |
^ |
按位異或 |
表達式^表達式 |
左到右 |
雙目運算符 |
10 |
| |
按位或 |
表達式|表達式 |
左到右 |
雙目運算符 |
11 |
&& |
邏輯與 |
表達式&&表達式 |
左到右 |
雙目運算符 |
12 |
|| |
邏輯或 |
表達式||表達式 |
左到右 |
雙目運算符 |
13 |
?: |
條件運算符 |
表達式1? 表達式2: 表達式3 |
右到左 |
三目運算符 |
14 |
= |
賦值運算符 |
變量=表達式 |
右到左 |
|
/= |
除后賦值 |
變量/=表達式 |
|||
*= |
乘后賦值 |
變量*=表達式 |
|||
%= |
取模后賦值 |
變量%=表達式 |
|||
+= |
加后賦值 |
變量+=表達式 |
|||
-= |
減后賦值 |
變量-=表達式 |
|||
<<= |
左移后賦值 |
變量<<=表達式 |
|||
>>= |
右移后賦值 |
變量>>=表達式 |
|||
&= |
按位與后賦值 |
變量&=表達式 |
|||
^= |
按位異或后賦值 |
變量^=表達式 |
|||
|= |
按位或后賦值 |
變量|=表達式 |
|||
15(最低) |
, |
逗號運算符 |
表達式,表達式,… |
左到右 |
從左向右順序運算 |
注意: 表格引用自 姜南(Slyar) 的博客, 並進行了部分修改, 已取得引用授權, 引用地址:http://www.slyar.com/blog/c-operator-priority.html
提高部分
=======
1. char與wchar_t
char與wchar_t的區別就在於占用的存儲單元大小不同, char型數據在內存中占1字節(Byte), 而wchar_t型字符數據實際上就是unsigned short int型數據, 無符號短整型, 之所以會出現wchar_t字符型就是為了解決計算機字符的顯示問題, 說到這里, 不得不提下ASCII與Unicode編碼問題:
1>. 關於ASCII
ASCII(American Standard Code for Information Interchange,美國信息互換標准代碼)
ASCII一共包含128個字符, 包括: 33個控制符號, 1個空格, 32個符號, 10個數字, 26個小寫字母和26個大寫字母。每個ASCII字符采用7位二進制編碼的方式。
使用char型數據存儲, char在內存中占一字節, 8位, 最多也只能表示256個不同的字符。
ASCII的優點:
十分可靠, 普遍扎根在我們的鍵盤、顯示器、系統硬件、打印機、操作系統等, 用途十分廣泛。
ASCII的缺點:
ASCII, 美國信息互換標准代碼, 美國原生, 不能滿足其他國家文字的需求, 例如, 中國的漢字?英國的英鎊符號(£)?等, 這些在ASCII都是找不到的。這也就意味着使用ASCII其他國家的文字在計算機中將無法正常被顯示, 也根本無法顯示, 因為找不到。
2>. 對ASCII的改進
由於ASCII不能很好的滿足其他國家文字的需求, 所以人們迫切希望能對ASCII進行改進。
①. 國際化標准組織的擴展方案
1967年, 國際化標准組織( ISO, International Organization for Standardization )推薦了ASCII的一個變種, 改動內容包括: 從ASCII中, 拿出 0x40('@'),、0x5B('[')、0x5C('\')、0x5D(']')、0x5E('^')、0x60(' ' ')、0x7B('{')、0x7C('|')、0x7D('}')、0x7E('~')這10個符號保留給各個國家單獨使用。這顯然不是解決ASCII國際化的好方法, 首先, 其他國家將這些保留字符重新定義為自己國家需要的字符后, 那么國際上的一致性將不能得到保證, 此外, 10個保留字符遠遠不能滿足美國的東方的一些國家使用的象形文字需求, 比如我們中國的漢字。
②. IBM公司的擴展方案
IBM公司采用了使用8位二進制編碼方式來表示ASCII, 使用一個字節來儲存字符, 這樣, 相對於7位的ASCII就可以多出128個額外字符空位來補充ASCII。
IBM對ASCII的主要擴展為: 補充了一些重音字符、小寫希臘字母、塊圖字符和線圖字符。同時, 還將一些補充的字符分配到ASCII的一些不必要的控制字符上。
(注: 在操作系統還是字符模式的年代, 塊圖字符和線圖字符常用來被應用軟件裝飾自己的程序顯示)
③. 微軟公司的擴展方案
1985年11月, Windows 1.0發布, 微軟采用了自己定義的一套字符集, 這套字符集被稱為"ANSI字符集", 是基於ANSI和ISO標准的一個草案。
在MS-DOS 3.3時代(1987年4月), 微軟為了使不同國家的計算機都能正常的顯示字符, 微軟采用了代碼頁概念, 不同國家的字符被規定在不同的代碼頁上, 例如代碼頁第437頁為美國英語, 850頁為拉丁語-1。用戶只要將代碼頁設置到自己所在的國家就能正常的進行工作, 但是如果用戶嘗試着將自己的文檔拿到與另外一個使用不同代碼頁的用戶的計算機上進行修改時, 自己的文檔的某些字符將會顯示成其他字符, 這還算好, 有解決方案, 應用軟件可以通過將代碼頁信息儲存到文件中, 使用時再進行一些代碼頁的轉換。
但在后來, 隨着代碼頁數量的劇增, Windows版本的不斷升級, 代碼頁的混淆問題開始日益凸顯, DS-DOS的代碼頁和Windows的代碼頁以及其他Windows版本的系統發生了不兼容, 例如MS-DOS代碼頁第855頁西里爾語在Windows中的1251頁西里爾語或者Macintosh的第10007頁西里爾語還都不一樣。
微軟為了解決東方一些國家使用的象形文字問題, 使用了雙字節字符集, 這些字符集同樣在不同的代碼頁, 代碼頁936(簡體中文)、949(韓文)、950(繁體中文)以及932(日文)。微軟的這個雙字節字符集和你象形的可能有所不同, 在這個雙字節字符集中, 前128個字符仍然是ASCII(1字節), 較高的128個擴展字符以跟隨第二個字節的方式用來表示象形文字(這兩個字節被稱為前導字節和尾隨字節)。
所以在這個代碼頁中, 有一個字節的字符, 還有2個字節的字符, 這就導致了兩個嚴重的問題:
1>. 在一段字符串中, 字符串的長度不能根據字節的個數確定, 要想確定字符串的長度必須檢查每個字節是不是雙字節字符的前導字節。
2>. 通過任意指向字符串中的一個指針, 無法知道前一個字符的地址, 通常要回到字符串的開始, 一直解析到指針所在的位置。
3>. Unicode
對ASCII擴展的過程中, 沒有能夠找到一個徹底解決世界上所有書面文字的表示方法, 很顯然, 1個字節, 256個字符是無法表示世界上所有的書面文字的, 因此, Unicode誕生了。
Unicode使用16位(2字節)的二進制編碼方式來表示字符, 我們知道, 16位最多能夠表示65536個字符, 65536個字符對於世界上的所有書面文字以及一些特殊符號來說已經足夠用了。在Unicode中, 不同國家使用不同的代碼段, 例如, 0x0530 - 0x058F為亞美尼亞語 (Armenian) 、0x0600 - 0x06FF為阿拉伯文 (Arabic) 、0x0E00 - 0x0E7F為泰文 (Thai) 、0x2700 - 0x27BF為印刷符號 (Dingbats) 、0x4E00 - 0x9FBF為中文。
Unicode的優點:
只有一個字符集, 避免了二義性, 能夠滿足跨語言、跨平台進行文本轉換、處理的要求。
Unicode的缺點:
Unicode字符的字符串比ASCII字符串占用的內存大兩倍。(筆者認為, 隨着計算機性能的不斷提高, 內存和外存容量的不斷增加, Unicode這一缺點可以慢慢忽略)
筆者提示: 對於這些歷史中描述的某些術語可以不去理解, 只要知道char字符所能描述的字符很少, 不能用來描述漢字、韓文等其他國家使用的文字或符號, 而wchar_t使用兩個字節對字符進行描述, 可以描述世界上所有的書面文字即可。
2. 基本數據類型的字節數
不同的數據類型編譯器為其分配的存儲單元大小不同, 這也正是決定數據類型能表示的范圍大小的原因, 比如int型數據, 當編譯器將其指定為2字節時, 1字節(Byte)等於8比特(Bit), 比特也是信息量單位, 一位二進制數所包含的信息就是1比特, 如二進制數的01100011就是8比特, 一字節。
數據在計算機中都是已二進制數形式表示的(確切來說是用二進制補碼以定點形式存放), 以整數為例, 在內存單元中, 每個整數是有符號位和數值位組成, 符號占一位, 0代表正, 1代表負, 后面是用二進制表示的數值為, 假定int為兩字節(注意: 2字節是在舊的編譯器上面, 我們現在使用的編譯器int實際為4字節, 這里僅僅是為了方便描述)
在默認情況下整數變量都是有符號型的, 可以使用unsigned修飾使其變成無符號型的。
16位二進制數, 除去一位用來表示數的正負, 僅剩下15位用來表示數據, 15位二進制0或1最多能表示的整數為2^15 = 32768, 但是由於0的存在所以需要再減1, 這樣, 2字節的int型數據所表示的范圍就是-32768 - 32767了。其他的數據類型表示范圍也可以根據這個思路進行計算。
相關數據類型所使用的字節數如下:
數據類型 | 占用字節數 |
char | 1字節 |
int | 不確定, 2或4字節 |
unsigned int | 不確定, 2或4字節 |
short [int] | 2字節 |
unsigned short [int] | 2字節 |
long [int] | 4字節 |
unsigned long [int] | 4字節 |
float | 4字節 |
double | 8字節 |
注意: 浮點型數據float和double沒有無符號型這一用法。
總結: 今天介紹了C++中的基本數據類型與基本的運算符, 此外還有其他更多的數據類型與運算符沒有介紹, 理論知識聽的太多也會感覺到疲憊, 所以這里只是簡單的描述了下, 我們只要對其有個大概的印象即可, 等用到時再詳細講述, 我們的原則就是: 引用王爽《匯編語言》書中的一句話, "以后用到的知識, 以后再說。", 今天的學習就到這里。
--------------------
wid, 2012.11.02
上一篇: 學習C++ -> 概述與相關工具的安裝