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

news2025/2/27 4:59:00

目录

一.修炼必备

二. 整型提升

三.实用调式技巧


一.修炼必备

 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排版问题,想要美观的文章阅读,请前往有道云阅读:有道云笔记

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/361471.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

植物大战 仿函数——C++

容器适配器 容器适配器不支持迭代器。栈这个东西&#xff0c;让你随便去遍历&#xff0c;是不好的。他是遵循后进先出的。所以他提供了一个街头top取得栈顶数据。 仿函数 仿函数&#xff08;functor&#xff09;是C中一种重载了函数调用运算符&#xff08;operator()&#x…

HTTP安全与HTTPS协议

目录 Http协议的安全问题 常见的加密方式 防止窃听 单向散列函数 单向散列值的特点 加密与解密 对称加密与非对称加密 对称加密的密钥配送问题 密钥配送问题的解决 非对称加密 前言&#xff1a; 公钥与私钥 非对称加密过程 混合密码系统 前言&#xff1a; 混合…

vue3中使用jszip压缩文件

1、安装依赖 npm install jszip npm install file-saver --save 2、使用 <template><el-card class"mb15"><template #header><span>jszip</span></template><!-- 二维码容器 --><div id"qrCodeBox">&…

手把手教你,解决C盘分区不足,C盘怎么扩大磁盘分区

由于在磁盘分区中&#xff0c;C盘是很重要的一个磁盘&#xff0c;为了保证C盘有足够的磁盘分区。其中扩大C盘分区很常见的操作之一。那么&#xff0c;C盘怎么扩大磁盘分区&#xff1f;在本文中&#xff0c;易我小编将全面地讲解C盘合并分区的方法。 一、为什么C盘怎么扩大磁盘分…

通过openssl生成pfx证书

通过centos7上自带的openssl工具来生成。首先创建一个pfxcert目录。然后进入此目录。 1.生成.key文件&#xff08;内含被加密后的私钥&#xff09;&#xff0c;要求输入一个自定义的密码 [rootlocalhost cert]# openssl genrsa -des3 -out server.key 2048 Generating RSA priv…

Win10+VS2019+Qt5.15.2下编译QCAD

一&#xff1a;官方说法&#xff1a;WindowsDownload and install a C compiler, for example:Visual Studio C Express or Visual Studio CommunityDownload and install Qt from qt.io (see supported platforms):Download for example the online installer fileqt-opensour…

2022年中国前10电商GMV总结

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 1&#xff0c;阿里8万亿;2&#xff0c;京东3万亿;3&#xff0c;拼多多3万亿;4&#xff0c;小程序私域电商3万亿;5&#xff0c;抖音电商1.4万亿。6&#xff0c;抖音本地生活服务电商600亿。7&#xf…

CAN总线通信

CAN总线通信 CAN 是控制器局域网络&#xff08;Controller Area Network&#xff09; 的缩写&#xff0c;是 ISO 国际标准化的串行通信协议。 CAN是半双工通信 CAN总线特点 (1) 多主控制 在总线空闲时&#xff0c;所有的单元都可开始发送消息&#xff08;多主控制&#xf…

Linux追踪技术 ftrace 原理

文章目录一、ftrace架构二、Ring Buffer三、tracer原理3.1 静态插桩3.2 动态插桩四、trace event五、kprobe event参考资料一、ftrace架构 Linux ftrace中&#xff0c;trace类型最基础的就是&#xff1a;tracer和event这两类。如下图所示&#xff1a; tracer发展出了function、…

界面控件DevExpress WPF Pivot Grid——拥有强大多维数据分析能力!

界面控件DevExpress WPF的Pivot Grid组件是一个类似excel的数据透视表&#xff0c;用于多维数据分析和跨选项卡报表生成。它拥有众多的布局自定义选项&#xff0c;允许开发者完全控制其UI且以用户为中心的功能使其易于部署。PS&#xff1a;DevExpress WPF拥有120个控件和库&…

Qt中的多线程

Qt中有多种方法实现多线程&#xff1a; QThreadQThreadPool和QPunnable&#xff08;重用线程&#xff09;Qt ConcurrentWorkerScript&#xff08;QML中的线程&#xff09;QThread 在上两篇文章中已经解释了&#xff0c;这里就不再赘述。 QThreadPoo和QRunnable&#xff08;实现…

SpringBoot2核心技术-核心功能【05、Web开发】

目录 1、SpringMVC自动配置概览 2、简单功能分析 2.1、静态资源访问 1、静态资源目录 2、静态资源访问前缀 2.2、欢迎页支持 2.3、自定义 Favicon 2.4、静态资源配置原理 3、请求参数处理 0、请求映射 1、rest使用与原理 2、请求映射原理 1、普通参数与基本注解 …

PrivateLoader PPI服务发现RisePro恶意软件窃取分发信息

称为PrivateLoader的按安装付费&#xff08;PPI&#xff09;软件下载器服务正用于恶意软件RisePro的信息窃取。Flashpoint 于 2022 年 12月13日发现了新的窃取者&#xff0c;此前发现了在名为Russian Market的非法网络犯罪市场上使用该恶意软件泄露的“几组日志”。RisePro是一…

因“AI”而“深” 第四届OpenI/O 启智开发者大会高校开源专场25日开启!

中国算力网资源不断开发&#xff0c;开源社区治理及AI开源生态引来众多有才之士参与建设&#xff0c;国家级开放创新应用平台、NLP大模型等高新技术内容逐渐走向科研舞台上聚光灯的中心&#xff0c;新时代的大门缓缓打开。在启智社区&#xff0c;有一群人&#xff0c;他们年纪轻…

BEV感知:DETR3D

3D检测&#xff1a;DETR3D前言MethodImage Feature Extracting2D-to-3D Feature TransformationLoss实验结果前言 在这篇paper&#xff0c;作者提出了一个更优雅的2D与3D之间转换的算法在自动驾驶领域&#xff0c;它不依赖于深度信息的预测&#xff0c;这个框架被称之为DETR3D…

性能测试学习和性能瓶颈分析路线

很多企业招聘都只写性能测试&#xff0c;会使用LR&#xff0c;jmeter工具。其实会使用jmeter和LR进行性能测试还只是性能测试的第一步&#xff0c;离真正的性能测试工程师还很远&#xff0c;笔者也还在路上 .。 性能测试&#xff0c;都是要求测试系统性能&#xff0c;系统自然…

面试中经常被问到的【宏定义】,改变你对【C\C++】中宏定义的认识。

最近遇到挺多宏定义的代码&#xff0c;其实挺烦的&#xff0c;每次看复杂的宏定义看到一半就懵了&#xff0c;今天盘一盘它。本篇设计宏定义的原理、使用方法、使用技巧。 目录 一、宏定义原理 二、宏定义定义复杂功能函数 2.1 定义注册函数 三、宏定义实现条件编译 四、宏…

【OpenCV学习笔记01】- 初步使用OpenCV实现人脸识别

想要使用opencv实现人脸识别&#xff0c;我们需要做这样几步&#xff1a; 1.opencv-python的安装 这里我们使用的python的opencv-python库&#xff0c;在安装opencv-python库之前&#xff0c;我们需要安装numpy, matplotlib。 # 安装指令 # 安装 numpy pip install numpy # …

Chirp-Z变换(线性调频Z变换)原理

Chirp-Z变换&#xff08;Chirp-Z Transform&#xff0c;CZT&#xff09; 采用FFT算法可以很快地计算出全部DFT值&#xff0c;即Z变换在单位圆上的全部等间隔采样值。 在实际情况中&#xff0c;并不需要对整个单位圆的频谱进行分析&#xff0c;例如&#xff0c;对于窄带信号&am…

运动型蓝牙耳机推荐哪款、最新运动蓝牙耳机推荐

提起运动耳机&#xff0c;如今很多运动爱好者和职业教练员们&#xff0c;都会向萌新推荐骨传导运动耳机。骨传导耳机解决了入耳式蓝牙耳机掉落的问题&#xff0c;佩戴相当舒服。骨传导耳机在佩戴过程中解放了双耳&#xff0c;不会因为耳机堵住耳朵&#xff0c;听不到环境音&…