定义:unsigned char: 无符号八位整数(即一个字节),取值范围0~255;由CHAR_BIT宏标准定义
独特之处:C/C++标准唯一规定适合直接访问内存的数据类型
Q:和uint8_t区别在哪里?
unit8_t是C99/C++11中引入的类型,是精确八位无符号整数的别名,但是在某些平台上可能不支持该类型;unsigned int是标准强制规定存在的类型
Q:和signed char/char有什么区别?
C++中,char可以是有符号的,也可以是无符号的。char类型的符号性由编译器决定。在有些编译器中,char是无符号的,但是在有些编译器中,char是有符号的。为了保证不出现潜在的错误,所以需要开发者在编码的时候显示地指出。
unsinged范围:0~255
signed范围:-128~127
类型 | 主要用途 |
char | 文本字符(ASCLL/UTF-8) |
unsigned char | 处理二进制数据、内存操作、图像处理(存储RGB像素值) |
signed char | 需要符号的小整数 |
从技术上来讲,unsigned char、signed char、char这三种都既可以当作字符来用,又可以当作小整形来用。但是设计地初衷是,char用来表示字符,unsigned、signed用来表示整数。
Q:如何避免输出打印的时候是数值,而不是字符串?
unsigned char name = 'A';
std::cout << static_cast<int>(name);
unsigned char的应用场景:
处理二进制数据(在图像处理、文件读写、网络通信等场景当中,希望存储0-255之间的值):
#include<iostream>
unsigned char arr[4] = {255, 128, 64, 0};
for (int i = 0; i < 4; i++) {
std::cout << static_cast<int>arr[i] << std::endl;
}
若使用signed char 类型,表示范围是-128~127,超过127的值会解释为负数,在处理文件字节流、图像像素时容易发生错误
内存效率:
在只用到无符号小整数的场景下,可以节省内存,提高效率
Deepseek给出的三种场景示例:
基本使用
#include <iostream>
#include <climits>
int main() {
unsigned char uc = 200; // 合法(0~255)
// unsigned char uc2 = -10; // 编译警告(可能被截断为 246)
std::cout << "Value: " << static_cast<int>(uc) << std::endl; // 输出 200
std::cout << "Max: " << UCHAR_MAX << std::endl; // 输出 255(来自 <climits>)
return 0;
}
二进制数据处理
// 用 unsigned char 读取文件二进制内容
#include <fstream>
#include <vector>
int main() {
std::ifstream file("data.bin", std::ios::binary);
std::vector<unsigned char> buffer(std::istreambuf_iterator<char>(file), {});
// 打印前 10 字节的十六进制值
for (int i = 0; i < 10 && i < buffer.size(); ++i) {
printf("%02X ", buffer[i]);
}
return 0;
}
内存操作
// 检查内存的字节表示
#include <cstring>
int main() {
int num = 0x12345678;
unsigned char* bytes = reinterpret_cast<unsigned char*>(&num);
for (size_t i = 0; i < sizeof(num); ++i) {
printf("Byte %zu: %02X\n", i, bytes[i]);
}
// 输出取决于 CPU 的字节序(大端或小端)
return 0;
}