--- title: 'C 型態' disqus: kyleAlien --- C 型態 === ## OverView of Content 型態的細節決定於作業系統 [TOC] ## 型態 ### 布林 \_Bool * \_Bool 在個型態在 C99 後才出現 or 載入 <stdbool.h> 標頭檔,`%i` * **\_Bool 判斷真假,不負責儲存數** * \_Bool 賦予值,**不管正負值,只要不是零就一定是 ture**,它不會強轉一個位元 > EX: \_Bool t = 0xFE | 0x00 > t = TRUE; > > 一般運算會是 0xFE,預計是自己會窄化到最後一個位元,也就是 0,應該為 FALSE > > 因為 t 是的值 != 0,所以為真 * \_Bool 的反向(~)會出現無法預期的錯誤,**\_Bool 的反向要用 (!)** * int(包括其他型態) 值的 !號 > 先判斷 int 是否 != 0,在給予 TRUE/FALSE,再用驚嘆號(!)反向剛剛得到個 \_Bool ```c= #include <stdio.h> int main() { _Bool x = 0; _Bool y = 0; printf("%x\n", x|y); _Bool z = 0; printf("%x\n", ~z); printf("%x\n", !z); int u = 0xFC; printf("%x\n", !u); int uu = -1; printf("%x\n", !uu); int uuu = 0; printf("%x\n", !uuu); return 0; } ``` **--實作--** > ![reference link](https://i.imgur.com/CzrwnFm.png) ### 字元 char * 儲存單一字元,'0' 不等於 0,字元的在 [**ASCII**](https://zh.wikipedia.org/wiki/ASCII) 中是圖型代表 0 也就是 0x30,`%c` ```c= int main(void) { char x = '0'; printf("'0': %c\n", x); printf("'0' in integer: %d\n", x); printf("'0' in hex: %x\n", x); int size = sizeof x; printf("size of double: %d Byte", size); return EXIT_SUCCESS; } ``` **--實做--** > ![](https://i.imgur.com/O94siik.png) ### 整數 int * int 有三種格式,8、10、16 進制 > 1. 最常使用的 10 進制,`%d` > 2. **開頭為 0,代表 8 進制**,`%o` > 3. **0 後接續 x,代表 16 進制**,`%x` ```c= #include <stdio.h> #include <stdlib.h> int main(void) { int x = 10; printf("10: %d\n", x); int y = 010; printf("010: %d\n", y); int z = 0x10; printf("010: %d\n", z); int size = sizeof x; printf("size of integer: %d Byte", size); return EXIT_SUCCESS; } ``` **--實做--** > ![](https://i.imgur.com/GyJR7C3.png) ### 浮點數 float * 只要以 [float](https://zh.wikipedia.org/wiki/%E6%B5%AE%E7%82%B9%E6%95%B0) 型式宣告,會根據 [**IEEE 754**](https://zh.wikipedia.org/wiki/IEEE_754) 的方式儲存在記憶體內,`%f` `%g` `%e` * OverSize 實就會自動縮減 ```c= int main(void) { double x = 10; printf("10: %f\n", x); double y = .10; printf(".10: %f\n", y); double z = 10.; printf("10.: %f\n", z); double u = -.10; printf("-.10: %f\n", u); float over = 0.112233445566778899; printf("over: %f\n", over); double e = 0.3e3; printf("0.3e3: %f\n", e); double p = 0x0.5p10; //(5/16) * 2^10 = 5*1024/16 = 320 printf("0.5p10: %f\n", p); int size = sizeof x; printf("size of double: %d Byte", size); return EXIT_SUCCESS; } ``` **--實做--** > e 是 10 的指數 > **p 是 2 的指數,但是必須搭配`16 進制`運算** > ![](https://i.imgur.com/bSuEHgj.png) ### 精確浮點數 double * [Double](https://zh.wikipedia.org/wiki/%E9%9B%99%E7%B2%BE%E5%BA%A6%E6%B5%AE%E9%BB%9E%E6%95%B8) 的精確度比 float 高,能儲存更多的小數位,會根據 [**IEEE 754**](https://zh.wikipedia.org/wiki/IEEE_754) 的方式儲存在記憶體內 * OverSize 實就會自動縮減,其餘跟 float 相像 ## 型態修飾 * long `%l`、long long `%ll`、short `%h`、unsigned、signed 這些修飾語句 * unsigned 的表達可以一般變數後面+U * long 的表達可以一般變數後面+L > unsigned long int a = 20000UL (unsigned & long) ## **數的大小 & 範圍** * 它 (boolean, char, int, float, double...) 並沒有實際定義其大小,它通常**取決於使用的作業系統**,系統如何定義 int 的大小它就是多大 > > 以 int 來說 > > 系統是 32位元就是 4 Byte > > 系統是 64位元就是 8 Byte > > > 以 long int 來說 > > 系統是 32位元就是 4 Byte > > 系統是 64位元就是 8 Byte ## Appendix & FAQ :::info ::: ###### tags: `C`