【C语言】类型转换和优先级

news2024/11/19 9:32:53

在这里插入图片描述

👦个人主页:Weraphael
✍🏻作者简介:目前正在回炉重造C语言(2023暑假)
✈️专栏:【C语言航路】
🐋 希望大家多多支持,咱一起进步!😁
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注😍


目录

  • 一、隐式类型转换
  • 二、整型提升的意义
  • 三、如何进行整型提升
      • 3.1 例1
      • 3.2 例2
      • 3.3 例3
  • 四、补充知识:char
  • 五、算术转换
  • 六、操作符的属性
      • 6.1 操作符的优先级
      • 6.2 运算法则

一、隐式类型转换

  • C语言的整型算术运算总是至少以 整型类型的精度 来进行的
  • 为了获取这个精度,表达式中的字符和短整型操作数在使用之前被转换为整型,这种转换称为 整型提升针对的是类型小于整型。例如:charshort

举个例子:

#include <stdio.h>
int main()
{
	char a = 3;
	char b = 127;
	char c = a + b;

	printf("c = %d\n", c);
	return 0;
}

由于c要以整型类型输出,因此根据整型提升,表达式中的字符和短整型操作数在使用之前被转换为整型,也就是说,a + b这个表达式在计算中,不会直接拿char类型的achar类型的b进行计算,而是把ab提升为整型,然后再相加,最后再截断

二、整型提升的意义

  • 表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。
  • 因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。通用CPUgeneral-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。
  • 所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为intunsigned int,然后才能送入CPU去执行运算。

三、如何进行整型提升

整型提升是按照变量的数据类型的符号位来提升的。
注意:如果是无符号(unsigned int)整型提升,高位补0

就拿开头的例子来演示:

3.1 例1

#include <stdio.h>
int main()
{
	char a = 3;
	char b = 127;
	char c = a + b;

	printf("c = %d\n", c);
	return 0;
}

【程序结果】

在这里插入图片描述

【解释如下】

在这里插入图片描述

3.2 例2

#include <stdio.h>
int main()
{
	char a = 0xb6;
	short b = 0xb600;
	int c = 0xb6000000;
	if (a == 0xb6)
		printf("a");
	if (b == 0xb600)
		printf("b");
	if (c == 0xb6000000)
		printf("c");

	return 0;
}

因为ab的类型都是小于int类型的,所以它们都会发生整型提升。对于a,它的二进制序列为:10110110,对于b,它的二进制序列为1011011000000000。然而它们的符号位都是1,所以补的都是1,最后肯定不一样,而c的类型就是int,不需要整型提升,所以最后会打印c

3.3 例3

#include <stdio.h>
int main()
{
	char a = 1;
	// %u - 打印无符号整数
	printf("%u\n", sizeof(a));
	printf("%u\n", sizeof(+a));
	printf("%u\n", sizeof(-a));
	
	return 0;
}

首先第一个是计算char类型所占用空间的字节数,毫无疑问就是1。第二个和第三个都要进行整型提升,因为+-是操作符,所以+a-a都是表达式。只要参与表达式计算,就要发生整型提升。提升为int类型,而int类型就是4个字。因此最后打印的结果是1 4 4

四、补充知识:char

  • 有符号的char的取值范围是:-128~127(一般常用的都是有符号的char
    在这里插入图片描述
  • 无符号的char的取值范围是:0~255
    在这里插入图片描述

五、算术转换

  • 小于整型会发生整型提升,而大于等于整型的则会发生算术转换。
  • long double、double、float、unsigned long int、long int、unsigned int、int,如果某个操作数的类型在上面的排名中较低的话,首先要转换为另一个操作数的类型后执行运算。一般都是讲低类型转化为高类型

例如:

int a = 3;
float b = 3.14;
//要计算a + b
a + b;

aintbfloat,它们的类型都大于等于整型,所以在计算的时候,由于a的层级比b低,所以需要把a的类型向float转换。

注意:算术转换需要合理,要不然会又一些潜在的问题。就比如:

float a = 3.14int b = a;

float类型要赋给int类型,如果不强制类型转换,也是会发生隐式转换,但是会有精度丢失,且编辑器会报警,但不会报错。

六、操作符的属性

复杂表达式的求值有三个影响的因素

  1. 操作符的优先级
  2. 操作符的结合性
  3. 是否控制求值顺序。

6.1 操作符的优先级

在这里插入图片描述

6.2 运算法则

  • 两个相邻的操作符先执行哪个?取决于它们的优先级
  • 如果两者的优先级相同,取决于他们的结合性(匹配规则)

例如:

#include <stdio.h>
int main()
{
	int a = 1;
	int b = 2;
	int c = 4;
	int d = a * 4 + b / 3 + c;
	printf("d = %d\n", d);

	return 0;
}

从左往右看,*+是相邻的,根据优先级先算*,接着再看+/,根据优先级先算/,最后再算+

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

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

相关文章

【Linux系统编程】Linux第一个小程序——进度条

文章目录 1. 对回车&#xff08;\r&#xff09;和换行&#xff08;\n&#xff09;的理解1.1 概念理解1.2 测试 2. 缓冲区的理解2.1 观察现象2.2 原因解释 3. 倒计时小程序4. 进度条小程序4.1 基本思路及实现4.2 改进及优化4.3 增加百分比显示4.4 增加旋转光标4.5 给进度条配色 …

基于FT232HL的USB2.0转ARINC429板卡

基于FT232HL的USB2.0转ARINC429板卡 1 概述 《USB2.0转ARINC429板卡》采用底板子板&#xff0c;层叠安装的结构&#xff1b;使用同样的底板&#xff0c;变换不同功能的子板实现不同的功能版本。 a) 降低硬件设计复杂度&#xff1a;新板卡设计只需要设计子板&#xff0c;子板的…

类和对象(C++)( static成员、explicit、友元、内部类、匿名对象)

类和对象 static成员概念static成员“登场”特性static成员使用 注意 explicit从一段代码引入explicit和explicit相关特性 友元友元函数引入问题解决 小结 友元类 内部类概念特性 匿名对象引入使用 static成员 概念 类的静态成员&#xff1a;声明为static的类成员。 静态成员变…

【黑客】网络安全靠自学?只会毁了你!

1️⃣网安现状 ❗本文面向所有 想要涉足网安领域 或 已经涉足但仍处在迷茫期 的伙伴&#xff0c;如果你月薪达到了3w&#xff0c;那么请你离开。 如果没有&#xff0c;希望你继续看下去&#xff0c;因为你人生的转折点将从这篇文章开始。 ✈️网络安全&#xff0c;一个近几年大…

5 个能出色完成数据恢复的免费数据恢复软件知识分享。

有时&#xff0c;由于意外删除或某些问题&#xff0c;您可能会丢失 Windows 10 笔记本电脑或台式机上的重要数据。Windows 操作系统不提供任何内部工具来恢复已删除的数据。但是有一些非常好的数据恢复软件可以更专业地完成这项工作。最好的人总是有报酬的&#xff0c;但不用担…

按键精灵、auto.js等一些移动端脚本 如何连接云服务器的数据库, 进行读写操作

一、技术背景 按键手机版和auto.js&#xff0c;只支持连接本地数据库sqllite&#xff0c;该数据库只存在本地 其他设备无法读写&#xff0c;就像本地的txt一样。 而很多脚本作者的需求是&#xff1a;多个脚本&#xff0c;甚至在全国不同城市的脚本也能读取和写入同一批数据&…

AJAX-day01

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 AJAX 概念和 axios 使用 什么是 AJAX 怎么用 AJAX &#xff1f; axios 使用 认识 URL 什么是 URL&…

韦东山Linux教学视频中的makefile文件详细介绍

前言 &#xff08;1&#xff09;在学习韦东山Linux教学视频的时候&#xff0c;他的makefile并没有做详细的介绍。以至于我学了很长时间对他的makefile文件不理解。所以本文将会详细介绍韦东山Linux教学视频中的makefile文件含义。 &#xff08;2&#xff09;注意&#xff1a;我…

使用 docker-compose 部署 Jenkins

注&#xff1a;我是在虚拟机&#xff08;Ubuntu&#xff09;上部署了 docker-compose&#xff0c;然后才使用 docker-compose 部署 Jenkins&#xff01; 关于如何在 Ubuntu 部署 docker-compose&#xff0c;可以看我其它的文章。 本文目录 1. 创建 docker_jenkins_compose 目录…

【NI USRP】每一个USRP是如何命名的呢,和原厂Ettus型号有什么关联呢?

详细的硬件配置&#xff0c;非常有助于设备的选型。 如果您采购了X310子板&#xff0c;是可以将其转化为对应的USRP型号的设备。 B系列 EttusNI-USRP频段最大带宽通道B200mini无70 MHZ - 6 GHZ56 MHz1X1B200mini-i无70 MHZ - 6 GHZ56 MHz1X1B205mini-i无70 MHZ - 6 GHZ56 MHz…

三菱以太网通讯模块在哪

捷米特JM-ETH-FX采用工业级设计&#xff0c;导轨安装&#xff0c;带通讯线。不占用PLC编程口&#xff0c;上位机通过以太网对PLC数据监控的同时&#xff0c;触摸屏可以通过复用接口X2与PLC进行通讯。捷米特JM-ETH-FX支持工控领域内绝大多数SCADA软件&#xff0c;支持三菱MC以太…

C#开发的OpenRA游戏之维修按钮

C#开发的OpenRA游戏之维修按钮 前面分析物品的变卖按钮,如果理解这个流程,再看其它按钮的流程,其实是一样的,所以前面的文章是关键,只有理解通透的基础之上,才能继续往下。 维修按钮的存在价值,就是当建筑物受到敌方破坏,还没有完全倒掉之前,可以使用金币来进行修理。…

java项目之电子商城系统(ssm+mysql+jsp)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的电子商城系统。技术交流和部署相关看文章末尾&#xff01; 开发环境&#xff1a; 后端&#xff1a; 开发语言&#xff1a;Java 框架&…

对抗业务逻辑攻击:传统安全工具为何失效

随着数字环境的不断发展&#xff0c;不良行为者寻求利用应用程序漏洞的策略也在不断发展。最阴险的攻击类型之一是业务逻辑攻击 (BLA)。与可以通过签名或模式识别的已知攻击&#xff08;例如 SQL 注入攻击&#xff09;不同&#xff0c;BLA 针对应用程序内的核心功能和决策过程。…

python_股票增加控制人与流通股东等筛选条件

目录 写字前面&#xff1a; 结果展示 获取数据 行业数据 控制人数据 十大流通股东数据 开始合并 1 从行业数据中提取证券股的行业数据 2 合并控制人数据 3 合并十大流通股东 4 把三个结果按列合并 写字前面&#xff1a; 在分析数据的时候&#xff0c;常常需要的字段…

Hippo4j监控RabbitMQ框架的线程池

&#x1f680; 线程池管理工具-Hippo4j &#x1f680; &#x1f332; AI工具、AI绘图、AI专栏 &#x1f340; &#x1f332; 如果你想学到最前沿、最火爆的技术&#xff0c;赶快加入吧✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;CSDN-Java领域优质创作者&#…

【分布式系统管理框架】Zookeeper集群

分布式系统管理框架 1. Zookeeper1.1 Zookeeper概述1.2 Zookeeper工作机制1.3 Zookeeper特点1.4 Zookeeper数据结构1.5 Zookeeper应用场景1.6 Zookeeper选举机制 2.部署Zookeeper集群3. 知识点总结3.1 zookeeper3.2 zookeeper选举机制 1. Zookeeper 1.1 Zookeeper概述 Zookee…

什么是微服务架构

什么是微服务架构&#x1f349; 你考虑过吗&#xff1f;什么是微服务&#xff0c;为什么越来越多的企业&#xff0c;为了使自己构建的应用满足客户的期望&#xff0c;而和微服务架构进行整合呢&#xff1f; 微服务&#xff0c;又叫微服务架构&#xff0c;是一种软件架构方式。…

web-报错注入

必要的函数 rand select rand(0) from hackbiao; rand(0)&#xff1a;生成以0开头的随机数&#xff0c;生成的数量与字段下数据的条数相等。如果i没有这个地段的话&#xff0c;就会自己形成一个新的字段打印出来。 count和group by grouip by在进行排序的时候&#xff0c;会…