C-1.1 Types & sizeof
ใน C ทุก type บอกคุณตรงๆ ว่ามันกิน memory เท่าไหร่ — ไม่มีซ่อน ไม่มีเดา ถ้าคุณรู้ขนาดของ type คุณรู้ต้นทุนของ data
ทำไม Size ถึงสำคัญ?
Section titled “ทำไม Size ถึงสำคัญ?”ลองคิดแบบนี้ — ถ้าคุณมีตาราง 1 ล้านแถว:
- ถ้าใช้
int(4 bytes) ต่อแถว = 4 MB - ถ้าใช้
long(8 bytes) ต่อแถว = 8 MB - เลือก type ผิด = เปลือง memory เป็นเท่าตัว
C Types พื้นฐาน
Section titled “C Types พื้นฐาน”| Type | ขนาด (bytes) | เก็บอะไร | ช่วงค่า |
|---|---|---|---|
char | 1 | ตัวอักษร / เลขเล็กๆ | -128 ถึง 127 (หรือ 0–255) |
int | 4 | จำนวนเต็ม | ประมาณ -2 พันล้าน ถึง +2 พันล้าน |
long | 8 | จำนวนเต็มใหญ่ | ประมาณ -9.2 x 10^18 |
float | 4 | ทศนิยม (ความแม่นต่ำ) | ~7 หลักนัยสำคัญ |
double | 8 | ทศนิยม (ความแม่นสูง) | ~15 หลักนัยสำคัญ |
sizeof() — เครื่องมือวัดขนาดจริง
Section titled “sizeof() — เครื่องมือวัดขนาดจริง”นี่คือจุดแข็งของ C — คุณวัดทุกอย่างได้ตรงๆ:
#include <stdio.h>
int main() { printf("char: %zu bytes\n", sizeof(char)); // 1 printf("int: %zu bytes\n", sizeof(int)); // 4 printf("long: %zu bytes\n", sizeof(long)); // 8 printf("float: %zu bytes\n", sizeof(float)); // 4 printf("double: %zu bytes\n", sizeof(double)); // 8
// วัดตัวแปรจริงก็ได้ int age = 25; printf("\nage (%d) uses %zu bytes\n", age, sizeof(age));
double salary = 45000.50; printf("salary (%.2f) uses %zu bytes\n", salary, sizeof(salary));
return 0;}ลองรันเอง: copy code นี้ไปวางที่ onlinegdb.com แล้วกด Run
สิ่งที่ C บอกคุณ:
sizeof(char)= 1 → ตัวอักษร 1 ตัวใช้ 1 byte เสมอsizeof(int)= 4 → เลขจำนวนเต็มใช้ 4 bytessizeof(double)= 8 → ทศนิยมแม่นยำใช้ 8 bytes
นี่คือ “ราคาจริง” ของ data ที่ภาษาอื่นซ่อนไว้
Sheets ไม่มี sizeof() — คุณไม่เคยเห็นว่าเซลล์หนึ่งใช้กี่ bytes
แต่เบื้องหลัง Sheets เก็บตัวเลขเป็น double (8 bytes) เสมอ — ไม่ว่าจะเป็น 1 หรือ 3.14159
นั่นคือเหตุผลที่ Sheets มีปัญหา floating-point เดียวกับ C
import syssys.getsizeof(42) # 28 bytes! (ใหญ่กว่า C มาก)sys.getsizeof(3.14) # 24 bytesPython ใช้ memory มากกว่า C เยอะมากเพราะ ทุกอย่างเป็น object ที่มี metadata แถมมา
SQL types map ตรงกับ C:
| SQL Type | C Type | Bytes |
|---|---|---|
SMALLINT | short | 2 |
INTEGER | int | 4 |
BIGINT | long | 8 |
REAL | float | 4 |
DOUBLE PRECISION | double | 8 |
SQL สืบทอด types มาจาก C โดยตรง — เข้าใจ C = เข้าใจ SQL types
จับคู่ C Types กับ SQL Types
Section titled “จับคู่ C Types กับ SQL Types”C type SQL type ขนาด───────── ────────────────── ─────char → CHAR(1) 1 byteint → INTEGER 4 byteslong → BIGINT 8 bytesfloat → REAL 4 bytesdouble → DOUBLE PRECISION 8 bytesลองทำเอง
Section titled “ลองทำเอง”ลองเพิ่ม short (2 bytes) และ unsigned int ลงใน code ด้านบน แล้วเปรียบเทียบขนาด
printf("short: %zu bytes\n", sizeof(short));printf("unsigned int: %zu bytes\n", sizeof(unsigned int));ถามตัวเอง: ทำไม unsigned int ถึงมีขนาดเท่า int? (คำใบ้: มันไม่ได้เก็บข้อมูลเพิ่ม แค่ ตีความ bits ต่างกัน)