###### tags: `FoShiShi` # 資料型態 ## What 資料型態是用來**定義一個變數的型態與範圍** 例:字串,整數,小數(浮點數) 定義的變數**必須待在規定的型態範圍內** 每個資料型態的性質也有所不同 :::success 就像你在跟別人描述一個物體的時候 你要**先說這個物體的範圍跟狀態是什麼** 他才會知道你在說什麼 ::: ## When 當你要 **輸入東西** 或是要 **拿各種資料拿來運算** 的時候 輸入的語法會在最下面講 ## How 這裡先給一些常用的資料型態 ### 各種資料型態 | 資料型態 | 位元組 | 型態範圍 | 表示狀態 | | ------------------ | ----- | ---------------------------------- | ------ | | int | 4 | $-2^{31}$ ~ $2^{31}-1$ | 整數 | | unsigned int | 4 | $0$ ~ $2^{32}-1$ | 非負整數 | | long long | 8 | $-2^{63}$ ~ $2^{63}-1$ | 整數 | | unsigned long long | 8 | $0$ ~ $2^{64}-1$ | 非負整數 | | bool | 1 | $true$ $or$ $false$ | 布林值 | | char | 1 | $-2^{7}$ ~ $2^{7}-1$ | 字元 | | float | 4 | $1.2*10^{-38}$ ~ $3.4*10^{38}$ | 浮點數 | | double | 8 | $2.2^*10^{-308}$ ~ $1.8^*10^{308}$ | 浮點數 | **整數**:就是**整數** **非負整數**:就是**不是負的整數** **布林值(boolean)**:**是(1)** 或 **否(0)** **字元(character)**:各種 **[拉丁符號](https://web.fg.tp.edu.tw/~anny/ASCII_table.htm)** **浮點數(floating-point number)**:就是**小數**(**點後可以是零**) --- ### 資料型態用法 當你要宣告一個變數的時候 可以這樣宣告: ```cpp= 資料型態名稱 變數名稱; 資料型態名稱 變數名稱 = ...; ``` 兩種方式的不同在於 第二種方式順便給了此變數一個初始值 `....`必須符合資料型態 例: ```cpp= int a = 1; long long b = 10; unsigned long long c = 100; float d = 1.414; double e = 3.14159; char f = 'A'; bool g = true; ``` :::warning **不能設兩個名稱一樣的變數** ::: :::info 直接使用**字元**(把字母直接拿來用)要用**單引號**框起來 像上面那樣 但如果本身就是字元,就可以直接使用 例: ```cpp= char chr = 'A'; char chr2 = chr; ``` ::: :::warning 當你**沒有給一個變數他裡面儲存的值是什麼**的時候 我們就**無法確切的知道它裡面到底是什麼** 就無法去使用他 ::: 例: ```cpp= int a; int b = 1; cout << b << endl; // 1 cout << a << endl; // 未知,因為尚未賦值 ``` --- ### 對於浮點數的額外提醒 `C++`在儲存數字的時候,會以二進位表示 所以在存十進位的浮點數時 **在進位轉換上可能會出現除不盡的情況**(就像`10/3 = 3.3333...` 會除不盡) 就會**導致儲存方面的錯誤** 有可能會出現很多看似荒謬的情況發生 例:`0.1 + 0.2` 不會等於 `0.3`(型態間的運算會在[`運算子`](https://chrislaiisme.github.io/FoShiShi/operators)那邊講) 浮點數在計算上會產生些許誤差 如果經過多次操作,誤差會更大 所以不要太過依賴`C++`中的浮點數 阿如果真的要用 **不要用`float`**,去用`double` 因為`float`的精準度只到點下3位 `double`到點下7位 --- ### 字串(淺談) 字串(`string`)是一種資料結構,不太算資料型態 但是我們很多地方都會用到 :::info 這裡先講個基本用法 我們可以**用`""`來包住一個字串** 我們就可以用它來做一些事情 例: ```cpp= cout << "AAA" << endl; ``` ::: 更多的用法我們會在 [**`字串`**](https://chrislaiisme.github.io/FoShiShi/string) 講義中講述 --- ### 輸入 跟輸出的語法差不多,只是**箭頭方向相反** 然後輸入的時候會**自動跳過空格跟換行** :::danger 因為輸入會自動跳過空格跟換行 所以不要寫 `cin >> endl;` 會爛掉 ::: ```cpp= int a; cin >> a; // 如果我們輸入 10 cout << a << endl; // 他就會輸出10 ``` --- ## 實際應用 ### 題目1 輸入一個整數,並把他輸出 :::spoiler solution 輸入用`cin` 輸出用`cout` 整數用`int, long long, ...` ```cpp= #include<iostream> using namespace std; int main() { int a; cin >> a; cout << a << endl; } ``` ::: ### 題目2 輸入一個字元,並把他輸出 :::spoiler solution 字元用`char` ```cpp= #include<iostream> using namespace std; int main() { char a; cin >> a; cout << a << endl; } ``` :::