详解C++:unsigned char类型

定义: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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

曙光Sun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值