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ểu | Kích thước | Phạm vi | Dùng cho |
|---|---|---|---|
char | 1 byte | -128~127 hoặc 0~255 | Ký tự văn bản (implementation-defined signedness) |
signed char | 1 byte | -128 ~ 127 | Số nguyên nhỏ có dấu |
unsigned char | 1 byte | 0 ~ 255 | Byte 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?
- Extended ASCII (128-255):
charsigned không lưu được (bị âm) - Binary data: File ảnh, network packet, crypto - cần toàn bộ 0-255
- Bitwise operations: Tránh sign extension khi shift
- std::byte (C++17): Alias của
unsigned charcho 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
charsignedness phụ thuộc compiler:-funsigned-char/-fsigned-char- Luôn dùng
unsigned char(hoặcstd::byte) cho binary data - Ép kiểu khi in:
static_cast<int>(uch)để in giá trị số thay vì ký tự std::stringdùngchar→ 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
charKHÔNG đảm bảo unsigned → không dùng cho binary- C++17:
std::bytelà alias semantic rõ ràng hơn