char 与 signed char 和 unsigned char三者之间的关系


  1. 三者都占用 1个字节,即 8 bit
  2. signed char取值范围(-128, 127)
  3. unsigned char取值范围(0, 255)
  4. 三个内存中存储的都是一样的东东,只是在运算时进行解析的方式不同
  5. 其如何解析和编译器有关。不同的编译器对char的解析不同,如将其定义为signed char的有:
  • VC编译器
  • x86上的GCC

    将其定义为unsigned char的有:arm-linux-gcc
  1. char可以当字符用,原始ASCII标准里定义的字符码值只有0~127,所以两种定义都装的下。
  2. char可以当单字节整数用,ASCII标准里的字符串都本质上是一个整数。
  3. unsigned char的高位扩展,以为没有最高的符号位,所以8位_bit_都作为了数值位,因此能表示(0~255)。但在屏幕上显示时可能会不同。

**测试代码: **

#include <stdio.h>
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
05-04 00:28