1. 程式人生 > >位元組,浮點數,符號型別,extern和include

位元組,浮點數,符號型別,extern和include

一 位元,位,字,位元組

1 位元=位=bit,位元組=byte,字=word。大多數計算機以2^N個bit作為塊來處理記憶體,可定址的最小記憶體塊稱為byte,儲存的基本單元稱為word。2 1byte=8bit,1word=4或8byte

二 浮點數

1 一個浮點數由三部分組成:符號位S、指數部分E(階碼)以及尾數部分M。(浮點數在計算機記憶體中的儲存格式

2 根據上面一條可得:
1)單精度浮點數(float)總共用32位來表示浮點數,最少有6位有效數字。比如"float a = 1.222222f;"中,a的值為"1.22222"。
2)雙精度浮點數(double)總共用64位來表示浮點數,最少16位有效數字。比如"double b = 1.12345678901234567890123456789;",b的值為"1.123456789012346"。
3)有效數字既包括整數位又包括小數位,可參看1)和2)。
4)被丟棄的多餘的小數位會採用四捨五入,可參看2)。
5)單精度浮點數(float)總共用32位來表示浮點數,可以得出float數會佔用4個位元組的空間進行儲存。雙精度浮點數(double)總共用64位來表示浮點數,可以得出double數會佔用8個位元組的空間進行儲存。

三 帶符號型別和無符號型別

2 int可看作signed int因為其預設為有符號,但是char並非在所有編譯器上都預設為signed char,儘管如此,char最終都只能是signed char和unsigned char中的一個。

4 對於unsigned需要注意,另外unsigned int k = 10的縮寫版為unsigned k = 10。

5  字串字面值拼接寫法與java在這裡很不一樣,unsigned char u[] = "abcd""efg""hijk";而在java裡需要用加號連線。

四 extern與include標頭檔案

1 需結合簡單例子並且經過多次報重複定義連結錯誤才能理解,在main.cpp中:

<span style="font-size:10px;">#include <iostream>

using namespace std;

int main() {
    std::cout << hkk << std::endl;
    return 0;
}</span>
在a.h中:
<span style="font-size:10px;">//
// Created by lawson on 16/10/8.
//

#ifndef A_H
#define A_H


#endif //A_H

int hkk = 9;

</span>

分別嘗試在main.cpp中(1)include(2)extern(3)同時包含兩者進行編譯;在a.cpp中(1)包含a.h(2)去掉a.h。
要理解它們很容易,但要表述起來很難。經過了上面幾個步驟的隨機組合報多次連結錯誤之後,回頭來看: (1)一個cpp檔案會被編譯連結為一個o檔案,而main.cpp也不例外。 (2)標頭檔案都會被包含進cpp檔案中進行編譯連結,只要cpp檔案包含該標頭檔案。因此只要"int hkk = 9;"這句話被寫在a.h中,a.cpp包含a.h,在main.cpp裡就只能通過extern方式而不能使用include包含a.h。 所以總結出來就是,extern方式使用變數hkk,在編譯連結當前cpp檔案時不會再定義該變數而只是拿來用;與之相對,說得好理解一點,include標頭檔案a.h方式會將"int hkk = 9;"這句程式碼分別拷貝進main.cpp和a.cpp進行編譯連結,這樣main.cpp.o中定義了一次hkk變數,而a.cpp.o中同樣定義了一次hkk變數,因此hkk被重複定義了。 同樣的,如果main.cpp中include的是a.cpp檔案,結果也是一樣。 因此一般的作法,是在a.cpp中定義hkk變數,同時在a.h中extern引用該變數,之後在main.cpp中無論是include進a.h還是直接extern變數hkk本質都變成了extern的引用方式,最終都是main.cpp.o檔案引用了a.cpp.o中的變數而已。 需要注意的是,在這樣的一般作法下,選擇include還是extern都需要根據不同情況判斷,比如,main.cpp需要從a.h引用很多個變數,最好include否則會寫很多句"extern xxx;",而main.cpp需要從很多個頭檔案引用變數,最好extern否則會include很多檔案。當然實際情況需要在架構時考慮到這種情況,初學不必深究。

最後,對於extern採用"引用"兩個字表述只是便於理解,而實際上它只是一個識別符號,意思是“這個變數定義在別處,編譯器請自己去找”。