在内存中,char与unsigned char没有什么不同,都是一个字节,唯一的区别是,char的最高位为符号位,因此char能表示-128~127, unsigned char没有符号位,因此能表示0~255,8个bit,最多256种情况,因此无论如何都能表示256个数字。
主要是符号位,但是在普通的赋值,读写文件和网络字节流都没什么区别,反正就是一个字节,不管最高位是什么,最终的读取结果都一样,只是你怎么理解最高位而已,在屏幕上面的显示可能不一样。
但是我们却发现在表示byte时,都用unsigned char,这是为什么呢?
byte没有什么符号位之说,更重要的是如果将byte的值赋给int,long等数据类型时,系统会做一些额外的工作。
如果是char,那么系统认为最高位是符号位,而int可能是16或者32位,那么会对最高位进行扩展(注意,赋给unsigned int也会扩展)
而如果是unsigned char,那么不会扩展
这就是二者的最大区别。
#include <stdio.h>
#include <thread>
#define INC_TO 1000000 // one million...
#include <mutex>
#include <functional>
#include <atomic>
#include <vector>
#include <sstream>
#include <iostream>
void test_unsigned_char(const unsigned char uc) {
char c = uc;
printf("%c %c\n", c, uc);
// char最高位符号位填充
printf("%X %X\n", c, uc);
unsigned int a = c, b=uc;
printf("%d %d\n", a, b);
int d=a, e=uc;
printf("%d %d\n", d, e);
printf("%X %X\n", d, e);
}
int main()
{
test_unsigned_char(129);
printf("最高位不是1:\n");
test_unsigned_char(0x7F);
int c = 0x7FFFFFFF;
printf("%d\n", c);
int e = 0x8FFFFF0;
unsigned int k = e;
printf("k:%d %X", k, e);
return 0;
}
输出:
� �
FFFFFF81 81
-127 129
-127 129
FFFFFF81 81
最高位不是1:
7F 7F
127 127
127 127
7F 7F
2147483647
k:150994928 8FFFFF0