1、unsigned char 与 signed char
类型 | 字节数(通常) | 数值范围 |
| 1 字节 |
|
| 1 字节 |
|
| 1 字节 |
|
char
的符号属性(signed
/unsigned
)取决于编译器,但 unsigned char
明确是无符号的。
#include <stdio.h>
int main() {
unsigned char u = 255;
signed char s = -1;
printf("unsigned char: %u\n", u); // 输出 255
printf("signed char: %d\n", s); // 输出 -1
return 0;
}
2、unsigned char 作用
unsigned char
是一种 无符号字符类型,在处理二进制数据、需要精确控制内存、或者做底层嵌入式编程,unsigned char
是非常常用且重要的类型。
1)表示原始字节数据
用于图像、网络、音频等“二进制”处理场景,确保不会意外解释为负数。
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *file = fopen("example.bin", "rb"); // 以二进制只读模式打开文件
if (file == NULL) {
perror("无法打开文件");
return 1;
}
unsigned char buffer[1024]; // 定义一个字节缓冲区
size_t bytesRead = fread(buffer, 1, 1024, file); // 从文件中读取最多1024字节
if (bytesRead == 0) {
perror("读取文件失败或文件为空");
fclose(file);
return 1;
}
printf("成功读取了 %zu 字节的数据:\n", bytesRead);
for (size_t i = 0; i < bytesRead; ++i) {
printf("%02X ", buffer[i]); // 以十六进制打印每个字节
if ((i + 1) % 16 == 0) printf("\n");
}
printf("\n");
fclose(file); // 关闭文件
return 0;
}
2)做位操作时更安全
使用 signed char
时,右移可能进行算术移位,结果可能不符合预期。unsigned
保证逻辑移位,结果更直观。
#include <stdio.h>
int main() {
unsigned char val = 0b11110000; // 二进制:11110000,即十进制 240
printf("原始值: 0x%02X (%u)\n", val, val);
val = val >> 2; // 右移两位:00001111,即十进制 60
printf("右移2位后的值: 0x%02X (%u)\n", val, val);
return 0;
}
3)避免符号扩展
当把 char
转换为 int
或进行位操作时,signed char
会自动进行符号扩展。
#include <stdio.h>
int main() {
// signed char 示例
signed char s = 0xFF; // 0xFF = -1(有符号的情况下)
int i = s; // 会进行符号扩展,i = -1(0xFFFFFFFF)
// unsigned char 示例
unsigned char u = 0xFF; // 0xFF = 255(无符号)
int j = u; // 直接转换为 int,j = 255(0x000000FF)
printf("signed char s = 0xFF --> int i = %d (0x%X)\n", i, i);
printf("unsigned char u = 0xFF --> int j = %d (0x%X)\n", j, j);
return 0;
}