筑基六层 —— 整型提升及实用调式技巧

目录

一.修炼必备

二. 整型提升

三.实用调式技巧


一.修炼必备

 1.入门必备:VS2019社区版,下载地址:Visual Studio 较旧的下载 - 2019、2017、2015 和以前的版本 (microsoft.com)

 2.趁手武器:印象笔记/有道云笔记

 3.修炼秘籍:牛客网 - 找工作神器|笔试题库|面试经验|实习招聘内推,求职就业一站解决_牛客网 (nowcoder.com)

 4.雷劫必备:leetcode 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 

 注:遇到瓶颈怎么办?百度百科_全球领先的中文百科全书 (baidu.com)

二. 整型提升

 1.什么是整型提升?

    ——C语言是整型算术运算总数以缺省整型精度运算的,为了得到这个精度,我们需要把短整型和字符型的数据在使用之前转换为普通整型。

 2.整型提升的意义?

    ——表达式的整型运算要在CPU的相应运算器件内执行,CPU内的整型运算器的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度;通用CPU是难以实现两个8比特位的数进行计算的,所有,表达式中小于int长度的整型值,万能均要把它转化为int的长度来进行计算,最后进行截断

 3.整型提升的范围

    ——char、short自身类型的值进行混合运算的时候会进行整型提升

 4.整型提升发生在什么时候?

    ——整型提升是按照变量的数据类型的符号位来提升的

1)负整数进行整型提升的时候,补1

2)正整数进行整型提升的时候,补0

3)无符号数进行整型提升的时候,补0

 5.几个小case快速上手整型提升

  1)case 1:

#include <stdio.h>

int main()
{
    char a = 0xb6;
    //10110110
    //11111111 11111111 11111111 10110110  整型提升
    //10110110  截断
    //10110101
    //11001010  原码 : -74
    //打印查看结果
    printf("%d\n", a);//-74
    
    short b = 0xb600;
    //10110110 00000000 原码
    //11111111 11111111 10110110 00000000 --> 整型提升
    //10110110 00000000  截断
    //10110101 11111111
    //11001010 00000000  原码:-18944
    //打印查看结果
    printf("%d\n", b);//-18944
    
    int c = 0xb6000000;
    
    if (a == 0xb6)
    {
        printf("a\n");
    }
    if (b == 0xb600)
    {
        printf("b\n");
    }
    if (c == 0xb6000000)
    {
        printf("c\n");//c
    }
    return 0;
}

  2)case 2:

#include <stdio.h>
int main()
{
    char c = 0;
    printf("%u\n", sizeof(c));//1
    
    //注:只要进行运算,那就会发生整型提升
    printf("%u\n", sizeof(+c));//4
    printf("%u\n", sizeof(-c));//4
    return 0;
}

  3)case 3:

#include <stdio.h>

int main()
{
    char a = 3;
    //00000101
    char b = 127;
    //01111111
    
    char c = a + b;
    //注:在运算的时候才会出现整型提升,写在上面是为了方便
    //00000011  : 3
    //01111111  : 127
    //10000010  结果
    //11111111 11111111 11111111 10000010
    //10000010  截断
    //10000001
    //11111110  -126
    printf("%d\n", c); //-126
    return 0;
}

三.实用调式技巧

 1.什么是bug?

    ——bug就是指程序中出现的错误,有很多bug的程序不是优秀的程序,我们应该把自己的程序的bug降低到可控范围内

 2.有那些bug?

  1)编译性错误,这种类型的bug编译器能给出提示,按照编译器的提示解决问题即可

  2)连接性错误,这种错误一般是标识符名字拼写错误或标识符不存在

  3)运行时的bug,这种bug编译器一般不会给出提示,需要我们自己去查找(最难)

 3.为什么需要调式?

    ——因为有一些bug编译器不能明显的给出提示,这个时候我们就需要通过调试去查找bug

 4.如何进行调式?

  1)发现程序错误的存在

  2)以隔离、消除等方式对错误进行定位

  3)确定错误产生的原因

  4)提出错误的纠正方法

  5)对程序给予改正,再重新测试

 5.调式的快捷键

  1)F10:逐过程调式(该过程可以是一个函数或一条语句)

  2)F11:逐行调式(会进入方法的内部进行调式)

  3)F9:创建断点和取消断点

  4)F5:开始调式,会直接跳到有断点的地方(和F9搭配使用)

 6.tips

  1)调试过程中查看变量

    ——点击调式、窗口、监视、然后随便选择一个监视

  2)查看变量的内存信息

    ——调式、窗口、内存、选择任意一个内存打开

  3)调用堆栈

    ——通过调用堆栈,清晰的看出函数之间调用的关系以及当前调用所处位置

 7.调式以下代码,说出问题所在

  case 1:求出1-10的阶乘 

#include <stdio.h>
int main()
{
    int i = 0;
    int sum = 0;//保存最终结果
    int n = 0;
    int ret = 1;//保存n的阶乘
    scanf("%d", &n);
    for (i = 1; i <= n; i++)
    {
        int j = 0;
        for (j = 1; j <= i; j++)
        {
            ret *= j;
        }
        sum += ret;
    }
    printf("%d\n", sum);
    return 0;
}

  case 2:说出死循环的原因

#include <stdio.h>
int main()
{
    int i = 0;
    int arr[10] = { 0 };
    //在VS2019中,栈中会留出两个int的空间
    //i和arr[12]占用了同一个内存空间,所有arr[12]的改变影响了i
    for (i = 0; i <= 12; i++)
    {
        arr[i] = 0;
        printf("hehe\n");
    }
    return 0;
}

 8.怎样写出优秀的代码

  1)使用assert

  2)在值不改变的情况下使用const

  3)养成良好的编程风格

  4)添加必要的注释

  5)要注意编码的陷阱

 9.模拟实现strlen函数求字符串

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

//加const是为了防止不小心修改了arr
int my_strlen(const char* arr)
{
    assert(arr);//防止arr是NULL
    int count = 0;
    while (*arr++ != '\0')
    {
        count++;
    }
    return count;
}

int main()
{
    char arr[100] = "husdghfjgfghkshf";
    //int len = strlen(arr);
    //printf("%d\n", len);//16
    
    int len = my_strlen(arr);
    printf("%d", len);
    return 0;
}

   !!!恭喜你,突破至筑基六层!!!

  注:由于CSDN排版问题,想要美观的文章阅读,请前往有道云阅读:有道云笔记

  • 19
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值