《C++ Primer》讀書筆記-第二章 變數和基本型別
第二章主要講變數和基本型別,這一章內容很多,我會分很多章節來寫。資料型別是程式的基礎:它告訴我們資料的意義以及我們能在資料上執行的操作。 C++不僅定義了幾種常用的基本內建型別(char, int, double等),還允許我們程式設計師定義自己的資料型別,最常用的就是我們後面經常提到的類,別害怕,類也是一種資料型別,只不過它比int、float等內建型別複雜一點,這個後面要經常提到。
基本內建型別
內建型別毫無疑問就是編譯器為我們已經定義好了的資料型別,常用內建型別如下,內容較多,我們常用的有 int(整型)、bool(布林型別)、char(字元型別)、short(短整型)、float(浮點型)、double(雙精度浮點型)。
同一型別的資料在不同機器上所佔的記憶體是不一樣的
內建型別的機器實現,大多數計算機以2的整數次冪個位元作為塊來處理記憶體,下面區分兩個概念
- 位元組(byte),可定址的最小記憶體塊
- 字(word),儲存的基本單元,通常由幾個位元組組成 例如:在一個位元組為8位元。
帶符號型別和無符號型別
帶符號型別可以表示正數,負數或0,可以理解為帶的符號就是正負號,無符號型別只能表示非負數,畢竟不讓帶符號,預設就是正號了。 例如unsigned long。有個小規定是unsigned int可以縮寫為unsigned,誰讓人家比較常用呢,程式設計師又會偷懶。
型別轉換
這個很好理解,不同的資料型別之間相互轉換,我直接寫程式碼你看註釋就好
bool b = 42; //b為真,除非b=0,其他均為真,bool型只有 0 1兩值
int i = b; //i=1,因為b是true,對應的int就是1,注意原來的42早就木有了,bool型值要注意啊,不要被外表給矇蔽了雙眼啊。
bool型值要注意啊,不要被外表給矇蔽了雙眼啊。
int a = 3.66; //a=3,注意不是四捨五入,而是直接捨棄小數部分 double c = a; //c=3.0,a為int型,轉double直接在後面加0
接下來兩個轉換稍微難理解一點,不過只要按照規則來推導,也很容易算出來
unsigned char m1 = -1; //不帶符號的char,不能表示負數。
signed char m2 = 256; //有符號的char
假設char佔8個位元組,你可以先算算m1和m2各等於多少
m1=255 因為:當我們給一個無符號數賦予一個超出它表示範圍的值時,只要對它總數取模算出餘數就好,在這裡,8位元unsigned char表示0-255區間,總數為256,-1對256取模為255。m2無定義,無定義就是不同的編譯器對它的處理方式不一樣,我們要避免給帶符號型別賦值超過它表示範圍的數。
int a = 1; double b = 2.5; cout << a+b << endl;
//3.5,當碰到+/-等運算子,都會把小範圍的數轉成大範圍的(這就是傳說中的型別提升,一人得道,雞犬升天),int->double,它的主要目的是保證不損失精度
我們可能會覺得自己肯定不會因為型別轉換這麼簡單的東西而犯錯,那我們來看看下面的程式碼,如果你看不出問題,就說明你也有可能會犯錯
unsigned u = 10; int i = -42; cout << u + i << endl;
如果int是4位元組32位,它輸出4294967264,對無符號數賦予超出範圍的值了啊,要轉換成對應範圍內的值再 int i=(-42)mod(0xffffffff)
倒序輸出10到0這十一個數
for(unsigned i=10; i>=0; --i) cout << i << endl;
這個會死迴圈,你懂的,不懂的要打屁股了(i為無符號型別,故其值一定是大於等於0的,把unsigned換成int帶符號的就可以了)。為了避免一些不必要的麻煩,建議不要混用帶符號型別和無符號型別
關於我自己
- 一個正派但不正經的程式設計師
- 18年計算機專業碩士畢業生,騰訊SNG部門實習生,現加盟快手科技 ,後端研發工程師一枚
- 喜歡技術,喜歡網際網路
- 民遙控 ,趙雷、陳粒、宋冬野
- 公眾號:程式設計美學,時不時寫篇文章,偶爾數羊,其實說到底,只是想和你聊聊

image.png