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

本文涉及的产品
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
简介: 截断+整型提升+算数转换练习

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


《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语言:设置地址为 0x67a9 的整型变量的值为 0xaa66
在C语言中,可以通过指针操作来实现对特定地址的访问和赋值。要将地址为 0x67a9 的整型变量值设为 0xaa66,可以先定义一个指向该地址的指针,并通过该指针对该内存位置进行赋值操作。需要注意的是,直接操作内存地址具有一定风险,必须确保地址合法且可写。代码示例应考虑字节序及内存对齐问题。
|
7月前
|
C语言
c语言表达式求值--整型提升
c语言表达式求值--整型提升
|
7月前
|
算法 C语言 容器
从C语言到C++_18(stack和queue的常用函数+相关练习)力扣(上)
从C语言到C++_18(stack和queue的常用函数+相关练习)力扣
50 0
|
3月前
|
存储 C语言
【C语言基础考研向】04整型进制转换
本文介绍了计算机中整型常量的不同进制表示,包括二进制、八进制、十六进制和十进制,并解释了它们之间的转换方法。以一个32位整型数为例,展示了其在不同进制下的表示形式及计算方法,特别指出在内存观察中常用十六进制,同时提到了小端存储方式对数据的影响。
|
7月前
|
C语言
C语言指针——练习
C语言指针——练习
|
6月前
|
C语言
C语言练习代码第一篇
C语言练习代码第一篇
|
7月前
|
编译器 C语言 C++
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题(下)
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题
56 2
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题(下)
|
6月前
|
存储 编译器 C语言
C语言学习记录——数据的存储(数据类型、类型的基本归类、整型在内存中的存储、大小端介绍、浮点型在内存中的存储)一
C语言学习记录——数据的存储(数据类型、类型的基本归类、整型在内存中的存储、大小端介绍、浮点型在内存中的存储)一
65 2
|
6月前
|
C语言
C语言学习记录——操作符习题、算数转换习题,多解法&优解法&单选题
C语言学习记录——操作符习题、算数转换习题,多解法&优解法&单选题
32 1
|
7月前
|
存储 前端开发 算法
从C语言到C++_18(stack和queue的常用函数+相关练习)力扣(下)
从C语言到C++_18(stack和queue的常用函数+相关练习)力扣
22 0