char 和 unsigned char -- 数据类型区别
除去布尔型和扩展的字符型之外, 其它整型可以划分为带符号的 (signed) 和无符号的 (unsigned) 两种.
类型 int,short,long 和 long long 都是带符号的, 通过在这些类型名前添加 unsigned 就可以得到无符号类型.
与其它整型不同, 字符型被分为了三种: char,singed char 和 unsigned char. 需特别注意的是: 类型 char 和类型 signed char 并不一样. 尽管字符型有三种, 但字符的表现形式却只有两种: 带符号的和无符号的. 类型 char 实际上会表现为上述两种形式中的一种, 具体是哪种是由编译器决定.
首先在内存中, 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
- void f(unsigned char v)
- {
- char c = v;
- unsigned char uc = v;
- unsigned int a = c, b = uc;
- int i = c, j = uc;
- printf("----------------\n");
- printf("%%c: %c, %c\n", c, uc);
- printf("%%X: %X, %X\n", c, uc);
- printf("%%u: %u, %u\n", a, b);
- printf("%%d: %d, %d\n", i, j);
- }
- int main(int argc, char *argv[])
- {
- f(0x80);
- f(0x7F);
- return 0;
- }
输出:
- %c: ?, ?
- %X: FFFFFF80, 80
- %u: 4294967168, 128
- %d: -128, 128
- ----------------
- %c: ,
- %X: 7F, 7F
- %u: 127, 127
- %d: 127, 127
来源: http://www.bubuko.com/infodetail-2991265.html