C语言:截断+整型提升+算数转换练习

简介: 截断+整型提升+算数转换练习

详情关于整型提升、算数转换与截断见文章:


《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;
}


五、代码五

int main()
{
    unsigned int i;
    for (i = 9; i >= 0; i--)
    {
        printf("%u\n", i);
    }
    return 0;
}

求输出结果


解析如下代码:

int main()
{
    unsigned int i;
    for (i = 9; i >= 0; i--)
    {
        printf("%u\n", i);
    }
    //无符号数9到0正常输出
    //当i = 0循环执行结束时,i--即 i = i - 1, i = -1
    //-1需要改为无符号数
    //11111111 11111111 11111111 11111111 (-1的补码)
    //11111111 11111111 11111111 11111111 (改无符号数后的补码)
    //11111111 11111111 11111111 11111111 (改无符号数后的原码)
    //结果:4,294,967,295
    //i又从4,294,967,295开始递减
    //每当i = 0循环执行结束时,i--又会回到4,294,967,295
    //所以程序死循环
    return 0;
}


运行结果如下,陷入死循环

b5f524bbcab7f0e9b85df8d67f42276f_2ba798ed0bee45c28e6af1022a9bcaa4.png

目录
相关文章
|
2月前
|
C语言
c语言点分十进制IP转整型
c语言点分十进制IP转整型
|
3月前
|
C语言
c语言编程练习题:7-24 猜数字游戏
c语言编程练习题:7-24 猜数字游戏
12 0
|
5月前
|
存储 C语言
C语言操作符[算数操作符,赋值操作符,单目操作符,移位操作符]
C语言操作符[算数操作符,赋值操作符,单目操作符,移位操作符]
|
6月前
|
C语言 C++
C语言:算数转换
已知:char 和 short 这两种字节长度小于 int 类型参与算术运算时,会进行整型提升。 而当字节长度大于 int 类型的数据参与运算时,如果某个操作符的两个操作数是不同类型,其中一个操作数需要按级别(级别低的数据转换为级别高的数据)转换为另一个操作数的类型,这样的转换即为算数转换
39 1
|
5月前
|
C语言
C语言之将长整型数中每一位上为奇数的数依次取出,构成一个新数放在t中。高位仍在高位,低位仍在低位。
C语言之将长整型数中每一位上为奇数的数依次取出,构成一个新数放在t中。高位仍在高位,低位仍在低位。
122 0
|
1天前
|
存储 物联网 编译器
详解【C语言】类型转换--整型提升,算术
详解【C语言】类型转换--整型提升,算术
|
2月前
|
C语言
C语言实例练习
【1月更文挑战第18天】C语言实例练习。
9 0
|
3月前
|
人工智能 编译器 C语言
C语言:指针详解【图解 + 练习】
C语言:指针详解【图解 + 练习】
|
3月前
|
存储 算法 C语言
C语言练习记录(蓝桥杯练习)(小蓝数点)
C语言练习记录(蓝桥杯练习)(小蓝数点)
|
3月前
|
编译器 C语言
C语言练习(三)字符串左旋结果
C语言练习(三)字符串左旋结果