C语言:截断+整型提升练习

 详情关于整型提升与截断见文章:《C语言:整型提升》

一、代码一

int main()
{
    char a = -1;
    signed char b = -1;
    unsigned char c = -1;

    printf("%d %d %d", a, b, c);
    return 0;
}

 求输出结果

解析如下代码:

int main()
{
    char a = -1;
    //10000000 00000000 00000000 00000001原
    //11111111111111111111111111111111111补
    //11111111截断补(首位作符号位)
    //11111111111111111111111111111111111整型提升补
    //10000000 00000000 00000000 00000001整型提升原
    signed char b = -1;
    //10000000 00000000 00000000 00000001原
    //11111111111111111111111111111111111补
    //11111111截断补(首位作符号位)
    //11111111111111111111111111111111111整型提升补
    //10000000 00000000 00000000 00000001整型提升原
    unsigned char c = -1;
    //10000000 00000000 00000000 00000001原
    //11111111111111111111111111111111111补
    //11111111截断补(首位作普通位)
    //11111111111111111111111111111111111整型提升补
    //000000000000000000000000000011111111整型提升原

    printf("%d %d %d", a, b, c);//-1 -1 255
    return 0;
}

二、代码二

int main()
{
    char a = -128;

    printf("%u\n", a);
    return 0;
}

求输出结果

解析如下代码:

int main()
{
    char a = -128;
    //10000000 00000000 00000000 10000000原
    //11111111 11111111 11111111 10000000补
    //10000000截断补(首位作为符号位)
    //%u是打印十进制无符号数
    //11111111 11111111 11111111 10000000整型提升补(先整型提升,最高位补符号位)
    //11111111 11111111 11111111 10000000改无符号数补
    //11111111 11111111 11111111 10000000改无符号数原

    printf("%u\n", a);//4,294,967,168
    return 0;
}

三、代码三

int main()
{
    char a = 128;
    printf("%u\n", a);
    return 0;
}

求输出结果

解析如下代码:

int main()
{
    char a = 128;
    //00000000 00000000 00000000 10000000原
    //00000000 00000000 00000000 10000000补
    //10000000截断补(首位作为符号位)
    //%u是打印十进制无符号数
    //11111111 11111111 11111111 10000000整型提升补(最高位补符号位)
    //11111111 11111111 11111111 10000000改无符号数补
    //11111111 11111111 11111111 10000000改无符号数原

    printf("%u\n", a);//4,294,967,168
    return 0;
}

四、代码四

int main()
{
    int i = -20;
    unsigned int j = 10;
    printf("%d", i + j);

    return 0;
}

求输出结果

解析如下代码:

int main()
{
    int i = -20;
    //10000000 00000000 00000000 00010100原
    //11111111 11111111 11111111 11101100补
    //11111111 11111111 11111111 11101100算数转换补(符号位当做普通位)
    unsigned int j = 10;
    //00000000 00000000 00000000 00001010原
    //00000000 00000000 00000000 00001010补

    //i+j
    //11111111 11111111 11111111 11101100(i算数转换后的补码)
    //00000000 00000000 00000000 00001010(j补码)
    //11111111 11111111 11111111 11110110(i+j后的补码)无符号数
    //%d是打印十进制有符号数
    //11111111 11111111 11111111 11110110(i+j后的补码)改有符号数
    //10000000 00000000 00000000 00001010(i+j改有符号数后的原码)

    printf("%d", i + j);//-10

    return 0;
}

你可能感兴趣的:(c语言)