ใน C++ มี Character Types 3 แบบ: char, signed char, unsigned char ซึ่งเป็น Distinct Types (ต่างกันทั้งคู่) แม้ขนาดเท่ากัน (1 Byte = 8 Bits)
ขนาดและ Range
| Type | Size | Range (Typical) | ใช้สำหรับ |
|---|---|---|---|
signed char | 1 Byte | -128 ถึง +127 | Small Signed Integer |
unsigned char | 1 Byte | 0 ถึง 255 | Byte Data, Raw Memory, Extended ASCII |
char | 1 Byte | Implementation-Defined (Signed/Unsigned) | Characters (Text) |
ข้อสำคัญ: char Signedness เป็น Implementation-Defined
- x86/ARM Linux: มักเป็น Signed (-128 to 127)
- ARM Bare Metal / บาง Compiler: มักเป็น Unsigned (0 to 255)
- ใช้
signed charหรือunsigned charโดยเฉพาะเมื่อทำ Bitwise/Arithmetic
เมื่อไหร่ใช้ unsigned char?
- Raw Byte Buffer:
std::vector<unsigned char> buffer;(Network, File I/O, Crypto) - Extended ASCII (128-255): Latin-1, Box Drawing Characters
- Bitwise Operations: หลีกเลี่ยง Sign Extension Issues
- Interfacing C APIs:
uint8_t(typedef ของ unsigned char)
ตัวอย่าง: Extended ASCII
#include <iostream>
int main() {
signed char sc = 200; // Overflow: Implementation-Defined (มัก -56)
unsigned char uc = 200; // OK: 200
std::cout << "signed char 200: " << static_cast<int>(sc) << '\n'; // -56 (typical)
std::cout << "unsigned char 200: " << static_cast<int>(uc) << '\n'; // 200
// Print Extended Char
unsigned char box = 0xC4; // '─' ใน CP437
std::cout << "Box char: " << box << '\n';
}
การแปลงระหว่าง Types
char c = 'A'; // ASCII 65
signed char sc = c; // OK (Implementation-Defined если char unsigned)
unsigned char uc = c; // OK
// Explicit Casts
uint8_t byte = static_cast<uint8_t>(c); // Clear Intent
Standard Library Usage
std::byte(C++17): Type-Safe Byte (ไม่ใช่ Arithmetic Type)std::string: ใช้char(Text)std::vector<std::byte>/<unsigned char>: Binary Datauint8_t,int8_t(<cstdint>): Fixed-Width Aliases
สรุป
char= สำหรับ Text (Characters)signed char= Small Signed Integer (-128..127)unsigned char/uint8_t/std::byte= Raw Byte Data (0..255)- อย่าใช้
charสำหรับ Arithmetic/Bitwise ใช้ Signed/Unsigned Char โดยเฉพาะ