Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

unsigned char ใน C++: ความแตกต่างจาก signed char และการใช้งาน

ใน C++ มี Character Types 3 แบบ: char, signed char, unsigned char ซึ่งเป็น Distinct Types (ต่างกันทั้งคู่) แม้ขนาดเท่ากัน (1 Byte = 8 Bits)

ขนาดและ Range

TypeSizeRange (Typical)ใช้สำหรับ
signed char1 Byte-128 ถึง +127Small Signed Integer
unsigned char1 Byte0 ถึง 255Byte Data, Raw Memory, Extended ASCII
char1 ByteImplementation-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?

  1. Raw Byte Buffer: std::vector<unsigned char> buffer; (Network, File I/O, Crypto)
  2. Extended ASCII (128-255): Latin-1, Box Drawing Characters
  3. Bitwise Operations: หลีกเลี่ยง Sign Extension Issues
  4. 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 Data
  • uint8_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 โดยเฉพาะ