Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

unsigned char trong C++ là gì?

unsigned char là kiểu dữ liệu 8-bit không dấu, biểu diễn giá trị từ 0 đến 255. Khác với char (có thể signed hoặc unsigned tùy compiler) và signed char (-128 đến 127).

So sánh 3 kiểu char

KiểuKích thướcPhạm viDùng cho
char1 byte-128~127 hoặc 0~255Ký tự văn bản (implementation-defined signedness)
signed char1 byte-128 ~ 127Số nguyên nhỏ có dấu
unsigned char1 byte0 ~ 255Byte thô (raw byte), extended ASCII, binary data

Khai báo


unsigned char ch = 'A';     // Giá trị 65
unsigned char byte = 255;   // Max value
unsigned char arr[1024];    // Buffer 1KB

Tại sao cần unsigned char?

  1. Extended ASCII (128-255): char signed không lưu được (bị âm)
  2. Binary data: File ảnh, network packet, crypto - cần toàn bộ 0-255
  3. Bitwise operations: Tránh sign extension khi shift
  4. std::byte (C++17): Alias của unsigned char cho byte thô

Ví dụ: Extended ASCII


#include <iostream>

int main() {
    signed char sc = 200;      // Overflow: -56 (implementation-defined)
    unsigned char uc = 200;    // OK: 200
    
    std::cout << "signed char: " << static_cast<int>(sc) << '\n';
    std::cout << "unsigned char: " << static_cast<int>(uc) << '\n';
    
    // In ký tự extended ASCII
    for (unsigned char c = 128; c < 160; ++c) {
        std::cout << static_cast<int>(c) << "=" << c << ' ';
    }
}

Ví dụ: Xử lý binary data


#include <vector>
#include <fstream>
#include <iostream>

void write_binary(const std::string& filename) {
    std::vector<unsigned char> data = {0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10}; // JPEG header
    std::ofstream ofs(filename, std::ios::binary);
    ofs.write(reinterpret_cast<const char*>(data.data()), data.size());
}

void read_binary(const std::string& filename) {
    std::ifstream ifs(filename, std::ios::binary | std::ios::ate);
    std::streamsize size = ifs.tellg();
    ifs.seekg(0);
    
    std::vector<unsigned char> buffer(size);
    ifs.read(reinterpret_cast<char*>(buffer.data()), size);
    
    for (auto b : buffer) {
        std::cout << std::hex << static_cast<int>(b) << ' ';
    }
}

C++17: std::byte


#include <cstddef>  // std::byte

std::byte b = std::byte{0xFF};
std::byte c = b | std::byte{0x0F};  // Bitwise ops cần cast rõ ràng
int val = std::to_integer<int>(b);  // Chuyển sang integer

Lưu ý quan trọng

  • char signedness phụ thuộc compiler: -funsigned-char / -fsigned-char
  • Luôn dùng unsigned char (hoặc std::byte) cho binary data
  • Ép kiểu khi in: static_cast<int>(uch) để in giá trị số thay vì ký tự
  • std::string dùng char → không phù hợp binary data (chứa null byte)

Tóm tắt

  • unsigned char: 8-bit unsigned, range 0-255
  • Dùng cho: Extended ASCII, binary data, byte buffer, bitwise
  • char KHÔNG đảm bảo unsigned → không dùng cho binary
  • C++17: std::byte là alias semantic rõ ràng hơn