C语言之整形提升和算术转换


目录

前言

一、整形提升

二、算术转换

总结


前言

        本文主要介绍C语言中的整形提升和算术转换的概念和意义,以及例题帮助理解,了解之后,我们就能知道在C语言中,字符型变量如何计算以及如果变量的类型、字节大小不一致的情况下,计算机是如何计算出结果的。


一、整形提升

1.概念

C语言中整型算术运算总是至少以缺省(默认)整型类型的精度来进行的。 为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升


2.整形提升的意义

        表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。

        因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。 通用CPU(general-purposeCPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。

        所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算


3.整形提升的规则

如何进行整体提升呢?

  1. 有符号整数提升是按照变量的数据类型的符号位来提升的
  2. 无符号整数提升,高位补0

整形提升只会发生在字符型或短整型变量的计算中


4.举例

(注:涉及到原码反码补码,不了解的可以参考我主页的位操作符文章)

了解了整形提升和提升规则后,我们看下面代码:

我们可以先猜一下最终结果

我们画图分析:(注:一个字符占一个字节,一个整形占4个字节,一个字节为8个比特位)

通过分析结果应该为-106,我们运行验证一下:

结果完全正确


6.小结

        以上就是关于整形提升的全部内容,我们一定要注意的是整形提升只发生在字符型或短整型变量的计算中,这种计算中的变化我们一般察觉不到,但确实是真真实实发生了的,另外就是注意整形提升的规则。


二、算术转换

        那么字符型或短整型有整形提升,那像整形与长整型这样的变量计算时会发生变化吗,答案是肯定的,这种变化就涉及到了算术转换

1.概念     

算术转换:如果某个操作符的各个操作数属于不同的类型,那么除非其中⼀个操作数的转换为另⼀个操作数的类型,否则操作就无法进行。

下面的层次体系称为寻常算术转换:(从下往上转换)

也就是说,遇到上面不同类型的变量计算,计算过程中会把层次低的变量转换为层次高的变量类型


2.举例

我们看下面代码:

#include <stdio.h>

int i;

int main()
{
    i--;
    if (i > sizeof(i))
    {
        printf(">\n");
    }
    else
    {
        printf("<\n");
    }

    return 0;
}

你觉得最终会打印出什么?

我们先看结果:

结果为大于号,为什么?

我们来分析一下:

  1. 首先第一个雷点为,全局变量 i 没有初始化,在C语言中,全局变量没有初始化会默认值为0而不是随机值
  2. 随后 i--,i 的值变为-1
  3. 第二个雷点:sizeof返回值为一个无符号整形4,也就是unsigned int ,而 i 为一个 int 类型,因此在它们的比较运算中会发生算术转换
  4. 因为 i 等于-1,它的补码为11111111111111111111111111111111,而将它转换为无符号整形,它将会被编译器解释为一个非常大的数字,注意:此处的转换不是改变符号位,而是直接解释为一个无符号整形,也就是正数,而正数的原反补码相同。32个1的二进制数将是32个比特位能表达的最大数字了,因此这个数值非常大,所以此处会打印大于号>


总结

        以上就是本文关于整形提升和算数转换的全部内容了,希望对大家有所帮助,感谢支持

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

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

相关文章

2012NOIP普及组真题 4. 文化之旅

线上OJ&#xff1a; 一本通&#xff1a;http://ybt.ssoier.cn:8088/problem_show.php?pid1960 相似题目&#xff1a; 本题和 2017年 NOIP J 组第3题 棋盘 类似。 核心思想&#xff1a; 由于本题的数据范围 n ≤ 100,非常小&#xff0c;所以可以采用 深搜 dfs 进行。同时&am…

C++程序设计:new和malloc的区别

new和malloc的区别 1.用法和语法2.类型安全性3.初始化4.分配数组5.异常处理示例代码 1.用法和语法 new 是 C 中的运算符&#xff0c;而 malloc 是 C 语言中的函数。new 用于动态分配单个对象或数组&#xff0c;并且在分配内存后调用对象的构造函数进行初始化。malloc 用于动态分…

golang学习笔记(内存模型和分配机制)

操作系统的存储管理 虚拟内存管理 虚拟内存是一种内存管理技术&#xff0c;它允许操作系统为每个进程提供一个比实际物理内存更大的地址空间。这个地址空间被称为虚拟地址空间&#xff0c;而实际的物理内存则被称为物理地址空间。使用虚拟内存有以下几点好处&#xff1a; 内…

C# 用户控件UserControl事件解绑资源释放

用户控件继承子 UserControl 。 现在有个业务需求在UserControl 所在的窗体关闭时解除事件HMouseDown绑定。 因没有相关的Close事件。后来本人想了一个办法在 ROICtlDesigner类的 Dispose 方法中执行相关的释放代码 比如解除事件绑定 释放资源 public partial class ROICt…

git 第一次安装设置用户名密码

git config --global user.name ljq git config --global user.email 15137659164qq.com创建公钥命令 输入后一直回车 ssh-keygen -t rsa下面这样代表成功 这里是公钥的 信息输入gitee 中 输入下面命令看是否和本机绑定成功 ssh -T gitgitee.com如何是这样&#xff0c;恭喜…

Ubuntu系统重装

1、删除相关卷&#xff0c;ubuntu引导项&#xff08;select disk、assign letter的方法&#xff09; Ubuntu20.04重装系统过程&#xff08;多图&#xff0c;含保存文件卸载旧系统安装新系统&#xff09;_ubuntu重装系统-CSDN博客 2、分配空间 efi 1024MB 逻辑分区 swap 8*1…

基于51单片机PWM控制直流电机—数码管显示

基于51单片机PWM控制直流电机 &#xff08;仿真&#xff0b;程序&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.L298驱动直流电机&#xff1b; 2.数码管显示转动方向和PWM占空比&#xff08;0-100%&#xff09;&#xff1b; 3.按键控制PWM占空比来加/…

20232803 2023-2024-2 《网络攻防实践》实践八报告

目录 1. 实践内容2. 实践过程2.1 动手实践任务一2.2 动手实践任务二&#xff1a;分析Crackme程序2.2.1 crackme1.exe2.2.2 crackme2.exe 2.3 分析实践任务一2.4 分析实践任务二 3. 学习中遇到的问题及解决4. 学习感悟、思考等 1. 实践内容 动手实践任务一&#xff1a;对提供的r…

Vue入门到关门之第三方框架elementui

1、什么是ElementUI&#xff1f; Element UI 是一个基于 Vue.js 的组件库&#xff0c;它提供了丰富的 UI 组件和一套完整的解决方案&#xff0c;用于快速构建现代化的 Web 应用程序。Element UI 的目标是帮助开发者快速构建出美观、易用的界面&#xff0c;并提供了丰富的组件&…

四种粒子群算法的Matlab实现

粒子群算法&#xff0c;又称为粒子群优化&#xff08;Particle Swarm Optimization&#xff0c;简称PSO&#xff09;&#xff0c;是一种基于群体智能的优化算法。它最初由James Kennedy和Russell Eberhart于1995年提出&#xff0c;灵感来源于鸟群捕食行为的研究。在PSO中&#…

R语言实战——中国职工平均工资的变化分析——相关与回归分析

链接: R语言学习—1—将数据框中某一列数据改成行名 R语言学习—2—安德鲁斯曲线分析时间序列数据 R语言学习—3—基本操作 R语言学习—4—数据矩阵及R表示 R语言的学习—5—多元数据直观表示 R语言学习—6—多元相关与回归分析 1、源数据 各行业平均工资变化 各地区平均工资…

list 的模拟实现

目录 1. list 的实现框架 2. push_back 3. 迭代器 4. constructor 4.1. default 4.2. fill 4.3. range 4.4. initializer list 5. insert 6. erase 7. clear 和 destructor 8. copy constructor 9. operator 10. const_iterator 10.1. 普通人的处理方案 10.2. …

运维的边缘计算

运维的边缘计算是指在靠近物或数据源头的一侧&#xff0c;采用网络、计算、存储、应用核心能力为一体的开放平台&#xff0c;进行运维管理和服务的计算模式。具体来说&#xff0c;边缘计算在运维领域的应用主要体现在以下几个方面&#xff1a; 超低时延&#xff1a;在传统的云…

数据库复习1

1.试述数据、数据库、数据库管理系统、数据库系统的概念 1.数据(Data): 数据是关于事物的符号表示或描述。它可以是任何事实、观察或者测量的结果&#xff0c;如数字、字符、声音、图像等。数据在没有上下文的情况下可能没有明确的意义。 2.数据库(Database): 数据库是一个持…

Linux——socket编程之tcp通信

前言 前面我们学习socket的udp通信&#xff0c;了解到了socket的概念与udp的实现方法&#xff0c;今天我们来学习一下面向连接的tcp通信。 一、tcp套接字创建 UDP和TCP都是通过套接字&#xff08;socket&#xff09;来实现通信的&#xff0c;因此TCP也得使用socket()接口创建…

时间复杂度_空间复杂度

时间复杂度_空间复杂度 1.算法效率 算法效率分析分为两种:第一种是时间效率&#xff0c;第二种是空间效率。 时间效率被称为时间复杂度&#xff0c;而空间效率被称作空间复杂度。时间复杂度主要衡量的是一个算法的运行速度&#xff0c;而空间复杂度主要衡量一个算法所需要的…

vue什么是服务端渲染(SSR)

Vue服务端渲染&#xff08;SSR&#xff09;在优化SEO方面有着显著的优势&#xff0c;因为它允许搜索引擎直接访问服务器渲染的页面&#xff0c;从而更容易解析页面内容。以下是一些关于如何使用Vue SSR优化SEO的建议&#xff1a; 为每个URL生成静态HTML&#xff1a;Vue SSR允许…

达摩院 2025届暑期实习 大模型算法

文章目录 写在前面一面/技术面 2024/4/7 晚上19:00-20:00二面/技术面 2024/4/23 早上11:15-12:15 写在前面 学校情况&#xff1a;211本中9硕&#xff0c;本硕都是计算机科班&#xff0c;但研究方向并不是NLP&#xff0c;而是图表示学习论文情况&#xff1a;1A(NeurIPS)1B(ICDM…

C#技巧之同步与异步

区别 首先&#xff0c;同步就是程序从上往下顺序执行&#xff0c;要执行完当前流程&#xff0c;才能往下个流程去。 而异步&#xff0c;则是启动当前流程以后&#xff0c;不需要等待流程完成&#xff0c;立刻就去执行下一个流程。 同步示例 创建一个窗体&#xff0c;往窗体里…

面试 Java 基础八股文十问十答第二十八期

面试 Java 基础八股文十问十答第二十八期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01;关注专栏后就能收到持续更新&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;动态代理是什么&am…