---
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;
}
```
**--實作--**
> 
### 字元 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;
}
```
**--實做--**
> 
### 整數 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;
}
```
**--實做--**
> 
### 浮點數 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 進制`運算**
> 
### 精確浮點數 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`