今天有同事问我unsigned char与char有啥区别,我结合自己的理解与前段时间看的深入理解计算机系统一书进行总结。
首先signed char与unsigned char都占一个字节,但是他们表示的数据范围不同,unsigned char 范围[0-255],signed char的范围是[-128 127],char的范围也是[-128,127].验证程序如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef unsigned char * byte_pointer;

void show_bytes(byte_pointer start,size_t len)
{
    size_t i;
    for(i = 0 ;i < len;i++)
    {
        printf(" %.2x",start[i]);
    }
    printf("\n");
}

int main()
{
    unsigned char a = 129;
    show_bytes(&a,sizeof(a));
    
    signed char b;
    memcpy(&b,&a,sizeof(b));
    show_bytes(&b,sizeof(b));
    
    char c;
    
    memcpy(&c,&a,sizeof(c));
    show_bytes(&c,sizeof(c));

    printf("%lu %lu %lu\n",sizeof(c),sizeof(b),sizeof(a));    
    printf("%d %d %d\n",a,b,c);
    return 0;
}

输出:

root@ubuntu:~# ./a.out 
 81
 81
 81
1 1 1
129 -127 -127
root@ubuntu:~#