From df2aa1ce2513a37e87f8346114f2f4884a0bcbde Mon Sep 17 00:00:00 2001
From: Mactavish <maczhanchao@yahoo.com>
Date: Sun, 23 Apr 2023 10:29:48 +0200
Subject: [PATCH] update

---
 clang.md | 42 +++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 41 insertions(+), 1 deletion(-)

diff --git a/clang.md b/clang.md
index 1dee39b..35fd68b 100644
--- a/clang.md
+++ b/clang.md
@@ -10,4 +10,44 @@ A full compilation in C is depicted in the following figure:
 
 ![](./images/c-compilation.png)
 
-A detailed explanation can be found [here](https://www.scaler.com/topics/c/compilation-process-in-c/)
+A detailed explanation can be found [here](https://www.scaler.com/topics/c/compilation-process-in-c/).
+
+## C Macros
+
+You often see C preprocessor macros defined to create "small functions"
+
+But they **aren't actual functions**, it just changes the **text** of the program.
+
+`#include` just copies that file into the current file and replace the arguments.
+
+Example:
+
+```c
+#define twox(x) (x + x)
+
+// twox(3); => (3 + 3);
+
+// this could lead to unexpected behaviours
+// int y = 2;
+// int z = twox(y++); => z = (y++ + y++);  z will atucally be 5
+```
+
+## Specific Sized Numbers
+
+C only guarantees minimum and relative size of "int", "short" etc...
+
+The integer data types range in size from at least 8 bits to at least 32 bits. The C99 standard extends this range to include integer sizes of at least 64 bits. 
+
+The types are ordered by the width, guaranteeing that _wider_ types are at least as large as _narrower_ types. E.g. `long long int` can represents all values that a `long int` can represent.
+
+If you need to have an exact width of something, you can use the `{u|}int{#}_t` type to specify:
+
+- signed or unsigned
+- number of bits
+
+For example:
+
+- `uint8_t` is an unsigned 8-bit integer
+- `int64_t` is an signed 64-bit integer
+
+All theses types are defined in the header file `stdint.h` instead of in the language itself.
-- 
GitLab