char、unsigned char区别

来源:互联网 发布:乔艾莉·波妮身世知乎 编辑:程序博客网 时间:2024/06/13 21:41

在c语言中,char有两种类型:signed char和unsigned char,从词义来看,分别表示有符号位和无符号位。

signed char因为有符号,表示范围是-128-127,但是ascii码的取值位0-127,即最高位必须为0;
unsigned char没有符号位,因此能表示0~255。
当最高位为1时,作为字符输出时显示为’?’。

在表示byte(c语言中没有byte关键字)时,都用unsigned char,是为了避免由于signed char转化为其他数值类型时扩展带来的问题。通过如下例子可以说明:

#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("%%c: %c, %c\n", c, uc);//符号位为1时,输出为?,表示非正常ascii值    //signed char作为十六进制int数据输出,    //系统会对符号位进行扩展,将符号为之前的多余位置为1,其实符号位为0也会扩展,    //只不过是多余的位被置0,没有效果而已    //16进制输出,显示结果为补码,负数补码ff ff ff c1的原码为-63    //ff ff ff c1 - 1 = ff ff ff c0 = 80 00 00 0011 1111 = -63    printf("%%x: %x, %x\n", c, uc);    printf("%%d: %d, %d\n", c, uc);}int main(){    printf("%x\n", -10);//使用16进制输出值,显示为补码值    printf("%o\n",-10);//使用8进制输出值,显示也为补码值    printf("%d\n",-10);//使用10进制输出值,显示为原码值    printf("1100 0001, 符号位位1\n");    f(0xc1);//传入字符为'A',但符号位为1    printf("0100 0001,符号位为0\n");    f(0x41); //传入字符为'A',符号位为0    short sh = -10;    printf("%d\n", sh);    //signed short 类型时,不会有符号扩展的问题,或直接赋予真值    return 0;}输出结果如下:fffffff637777777766-101100 0001, 符号位位1%c: ?, ?%x: ffffffc1, c1%d: -63, 1930100 0001,符号位为0%c: A, A%x: 41, 41%d: 65, 65-10
原创粉丝点击