C语言:整型提升
一, 整型提升
整型提升的规则
- 有符号类型:如果原类型是有符号类型(如
signed char
、signed short
),则将其值符号扩展为int
类型。也就是说,如果原类型的最高位(符号位)是 1,则在扩展后的int
类型中,高位全部补 1;如果最高位是 0,则高位全部补 0。 - 无符号类型:如果原类型是无符号类型(如
unsigned char
、unsigned short
),则将其值零扩展为int
类型,即高位全部补 0。
整型提升的原因
- 提高计算效率:大多数计算机的 CPU 对于
int
类型的运算处理速度更快,将小整数类型提升为int
类型可以利用 CPU 对int
运算的优化,提高计算效率。 - 统一运算操作数类型:在表达式求值时,要求运算符的操作数类型一致。通过整型提升,可以将不同的小整数类型统一转换为
int
类型,便于进行运算。
整型提升的示例
示例 1:有符号类型的整型提升
#include <stdio.h>int main() { // 10000001(原码)// 11111111(反码)signed char a = -1; // 有符号字符型,8 位,二进制表示为 11111111(补码,只取八位比特)int result = a + 2; // 进行加法运算,a 会被提升为 int 类型// 有符号字符型 -1 提升为 int 类型后,二进制表示为 11111111 11111111 11111111 11111111//2的二进制表示00000000 00000000 00000000 00000010(补码)//提升后:-1+2=00000000 00000000 00000000 00000001(补码) printf("结果: %d\n", result);return 0;
}
在这个例子中,signed char
类型的变量 a
的值为 -1,其 8 位二进制表示是 11111111
。在进行 a + 2
运算时,a
会被提升为 int
类型,通过符号扩展,其 32 位二进制表示变为 11111111 11111111 11111111 11111111
。然后与 2
(二进制 00000000 00000000 00000000 00000010
)相加,得到结果 1
。
示例 2:无符号类型的整型提升
#include <stdio.h>int main() {unsigned char b = 255; // 无符号字符型,8 位,二进制表示为 11111111(补码)int result = b + 1; // 进行加法运算,b 会被提升为 int 类型// 无符号字符型 255 提升为 int 类型后,二进制表示为 00000000 00000000 00000000 11111111(补码)// 与 1 相加后结果为 256,二进制表示为 00000000 00000000 00000001 00000000(补码)printf("结果: %d\n", result);return 0;
}
这里 unsigned char
类型的变量 b
的值为 255,其 8 位二进制表示是 11111111
。在进行 b + 1
运算时,b
会被提升为 int
类型,通过零扩展,其 32 位二进制表示变为 00000000 00000000 00000000 11111111
。然后与 1
(二进制 00000000 00000000 00000000 00000001
)相加,得到结果 256
。
注意事项
- 对表达式结果的影响:整型提升可能会影响表达式的计算结果,特别是在涉及有符号和无符号类型混合运算时。例如:
#include <stdio.h>int main() {signed char a = -1;unsigned char b = 255;int result = a + b;// a 提升为 int 类型后是负数,b 提升为 int 类型后是正数// 相加结果为 254printf("结果: %d\n", result);return 0; }
在这个例子中,
signed char
类型的a
提升为int
类型后是负数,unsigned char
类型的b
提升为int
类型后是正数,它们相加的结果是254
。 - 位运算中的整型提升:在进行位运算(如按位与
&
、按位或|
等)时,也会进行整型提升。例如:#include <stdio.h>int main(){unsigned char x = 0xFF;unsigned char y = 0x01;unsigned char result = x & y;// x 和 y 先提升为 int 类型进行位与运算,结果再截断为 unsigned char 类型printf("结果: %d\n", result);return 0; }
算术转换
- 如果某个操作符的各个操作数属于不同的类型,那么除⾮其中⼀个操作数的转换为另⼀个操作数的类型,否则操作就⽆法进⾏。下⾯的层次体系称为寻常算术转换。
算术转换的规则
算术转换遵循以下一般规则,这些规则按照优先级从高到低的顺序执行:
- 长双精度扩展:如果其中一个操作数是
long double
类型,那么另一个操作数会被转换为long double
类型。 - 双精度扩展:如果其中一个操作数是
double
类型,而另一个不是long double
类型,那么另一个操作数会被转换为double
类型。 - 单精度扩展:如果其中一个操作数是
float
类型,而另一个不是double
或long double
类型,那么另一个操作数会被转换为float
类型。 - 整型提升:如果操作数不属于上述浮点类型,那么会先对操作数进行整型提升(将比
int
小的整数类型转换为int
或unsigned int
)。 - 整数类型转换:经过整型提升后,如果两个操作数的类型仍然不同,会将较低等级的整数类型转换为较高等级的整数类型。整数类型的等级从低到高大致为:
char
、short
、int
、unsigned int
、long
、unsigned long
、long long
、unsigned long long
。
算术转换的原因:
- 统一操作数类型:C 语言的二元运算符通常要求两个操作数的类型相同,算术转换可以将不同类型的操作数转换为相同类型,使得运算符能够正确执行。
- 保证计算精度:在进行混合类型的算术运算时,将操作数转换为较高精度的类型可以避免数据丢失,保证计算结果的准确性。
算术转换的示例
示例 1:浮点类型的算术转换
#include <stdio.h>int main()
{float f = 3.5f;double d = 2.0;// f 会被转换为 double 类型进行计算double result = f + d;printf("结果: %lf\n", result);return 0;
}
在这个例子中,由于 d
是 double
类型,f
是 float
类型,根据规则,f
会被转换为 double
类型,然后进行加法运算。
示例 2:整数类型的算术转换
#include <stdio.h>int main(){char c = 'A'; // ASCII 码值为 65int i = 10;// c 会先进行整型提升为 int 类型,然后进行加法运算int result = c + i;printf("结果: %d\n", result);return 0;
}
这里 c
是 char
类型,i
是 int
类型,c
会先进行整型提升为 int
类型,然后与 i
进行加法运算。
示例 3:混合类型的算术转换
#include <stdio.h>int main() {short s = 5;float f = 2.5f;// s 会先进行整型提升为 int 类型,然后再转换为 float 类型进行计算float result = s + f;printf("结果: %f\n", result);return 0;
}
在这个例子中,s
是 short
类型,f
是 float
类型。s
先进行整型提升为 int
类型,然后根据规则,int
类型的 s
会被转换为 float
类型,再与 f
进行加法运算。
注意事项
- 数据丢失问题:在进行算术转换时,如果将较高精度的类型转换为较低精度的类型,可能会导致数据丢失。例如:
#include <stdio.h>int main() {double d = 123456789.123;int i = (int)d; // 强制将 double 类型转换为 int 类型,可能会丢失小数部分printf("结果: %d\n", i);return 0; }
在这个例子中,将
double
类型的d
强制转换为int
类型,小数部分会被截断,可能会导致数据丢失。 - 无符号类型的影响:当涉及无符号类型和有符号类型的运算时,需要特别注意结果的符号性。例如:
#include <stdio.h>int main(){unsigned int u = 4294967295; // 无符号整型的最大值int i = -1;// 由于算术转换,i 会被转换为无符号类型,结果可能不符合预期unsigned int result = u + i;printf("结果: %u\n", result);return 0; }
在这个例子中,
i
是有符号int
类型,u
是无符号int
类型,在进行加法运算时,i
会被转换为无符号类型,导致结果可能不符合预期。理解算术转换规则对于编写正确的 C 语言代码至关重要,特别是在处理混合类型的算术运算时。
相关文章:
C语言:整型提升
一, 整型提升 C语⾔中整型算术运算总是⾄少以缺省(默认)整型类型的精度来进⾏的。 为了获得这个精度,表达式中的字符和短整型操作数在使⽤之前被转换为普通整型,这种转换称为整型提升。 整型提升的意义: …...
DRM系列六:Drm之KMS
KMS(Kernel Mode Setting)是负责显示输出的核心组件,它处理与plane、crtc、encoder和connector相关的各项任务。简单来说,KMS就是结构体drm_mode_config、drm_mode_object和组件(object)的结合。 KMSdrm_m…...
前端 Vue 性能提升策略
一、引言 前端性能优化是确保 Web 应用快速响应和流畅用户体验的关键。对于使用 Vue.js 构建的应用,性能优化不仅涉及通用的前端技术,还包括针对 Vue 特性的特定优化措施。本文将从多个方面探讨如何全面提升前端和 Vue 应用的性能。 二、前端性能优化基础 1. 减少初始加载…...
【C语言】static关键字的三种用法
【C语言】static关键字的三种用法 C语言中的static关键字是一个存储类说明符,它可以用来修饰变量和函数。static关键字的主要作用是控制变量或函数的生命周期和可见性。以下是static关键字的一些主要用法和含义: 局部静态变量: 当static修饰…...
数仓实战项目,大数据数仓实战(离线数仓+实时数仓)
1.课程目标 2.电商行业与电商系统介绍 3.数仓项目整体技术架构介绍 4.数仓项目架构-kylin补充 5.数仓具体技术介绍与项目环境介绍 6.kettle的介绍与安装 7.kettle入门案例 这个连线是点击shift键,然后鼠标左键拖动 ctrls保存一下 csv输入配置 Excel输出配置 配置完 …...
Unity安装教学与相关问题
文章目录 1. 前言2.Unity Hub2.1 下载Unity Hub2.2 安装Unity Hub2.3 注册Unity账号2.4 在Hub上登录账号2.5 在Hub上获取许可证 3. 下载并安装Unity3.1 从Unity Hub下载(推荐)3.1.1 选择下载版本3.1.2 选择下载组件3.1.3 安装Visual Studio Community 20…...
Linux_线程同步生产者消费者模型
同步的相关概念 同步:在保证数据安全的前提下,让线程能够按照某种特定的顺序访问临界资源,从而有效避免饥饿问题,叫做同步竞态条件:因为时序问题,而导致程序异常,我们称之为竞态条件。 同步的…...
边缘检测算法(candy)
人工智能例子汇总:AI常见的算法和例子-CSDN博客 Canny 边缘检测的步骤 1. 灰度转换 如果输入的是彩色图像,则需要先转换为 灰度图像,因为边缘检测通常在单通道图像上进行。 2. 高斯滤波(Gaussian Blur) 由于边缘…...
Hot100之双指针
283移动零 题目 思路解析 那我们就把不为0的数字都放在数组前面,然后数组后面的数字都为0就行了 代码 class Solution {public void moveZeroes(int[] nums) {int left 0;for (int num : nums) {if (num ! 0) {nums[left] num;// left最后会变成数组中不为0的数…...
租房管理系统实现智能化租赁提升用户体验与运营效率
内容概要 在当今快速发展的租赁市场中,租房管理系统的智能化转型显得尤为重要。它不仅帮助房东和租客之间建立更高效的沟通桥梁,还优化了整个租赁流程。通过智能化技术,这套系统能够自动处理资产管理、合同签署、财务管理等所有关键环节。这…...
spring和Mybatis的逆向工程
在现代企业级开发中,使用Spring和MyBatis进行快速、高效的数据库操作是非常常见的。本文将深入探讨如何使用Spring和MyBatis进行逆向工程,帮助开发者自动生成数据库相关的代码,提高开发效率和代码质量。 一、什么是逆向工程 逆向工程是指从…...
计算机网络 IP 网络层 2 (重置版)
IP的简介: IP 地址是互联网协议地址(Internet Protocol Address)的简称,是分配给连接到互联网的设备的唯一标识符,用于在网络中定位和通信。 IP编制的历史阶段: 1,分类的IP地址: …...
松灵机器人 scout ros2 驱动 安装
必须使用 ubuntu22 必须使用 链接的humble版本 #打开can 口 sudo modprobe gs_usbsudo ip link set can0 up type can bitrate 500000sudo ip link set can0 up type can bitrate 500000sudo apt install can-utilscandump can0mkdir -p ~/ros2_ws/srccd ~/ros2_ws/src git cl…...
【Leetcode 每日一题】541. 反转字符串 II
问题背景 给定一个字符串 s s s 和一个整数 k k k,从字符串开头算起,每计数至 2 k 2k 2k 个字符,就反转这 2 k 2k 2k 字符中的前 k k k 个字符。 如果剩余字符少于 k k k 个,则将剩余字符全部反转。如果剩余字符小于 2 k…...
掌握API和控制点(从Java到JNI接口)_35 JNI开发与NDK 03
3、 如何载入 .so档案 VM的角色 由于Android的应用层级类别都是以Java撰写的,这些Java类别转译为Dex型式的Bytecode之后,必须仰赖Dalvik虚拟机器(VM: Virtual Machine)来执行之。 VM在Android平台里,扮演很重要的角色。此外,在执…...
解锁豆瓣高清海报(二) 使用 OpenCV 拼接和压缩
解锁豆瓣高清海报(二): 使用 OpenCV 拼接和压缩 脚本地址: 项目地址: Gazer PixelWeaver.py pixel_squeezer_cv2.py 前瞻 继上一篇“解锁豆瓣高清海报(一) 深度爬虫与requests进阶之路”成功爬取豆瓣电影海报之后,本文将介绍如何使用 OpenCV 对这些海报进行智…...
【C/C++】Windows SAPI自实现文字转语音
本文通过封装Windows SAPI(Speech Application Programming Interface),提供了一个现代化的C接口实现文字转语音功能。主要特性包括支持同步/异步语音合成、可调节语速(-10到10)和音量控制(0-100%ÿ…...
openmv的端口被拆分为两个 导致电脑无法访问openmv文件系统解决办法 openmv USB功能改动 openmv驱动被更改如何修复
我之前误打误撞遇到一次,直接把openmv的全部端口删除卸载然后重新插上就会自动重新装上一个openmv端口修复成功,大家可以先试试不行再用下面的方法 全部卸载再重新插拔openmv 要解决OpenMV IDE中出现的两个端口问题,可以尝试以下步骤&#x…...
8.攻防世界Web_php_wrong_nginx_config
进入题目页面如下 尝试弱口令密码登录 一直显示网站建设中,尝试无果,查看源码也没有什么特别漏洞存在 用Kali中的dirsearch扫描根目录试试 命令: dirsearch -u http://61.147.171.105:53736/ -e* 登录文件便是刚才登录的界面打开robots.txt…...
音叉模态分析
目录 0 序言 1 自由状态下模态求解 1.1 添加模态项目 1.2 生成网格 1.3 设置最大模态阶数 1.4 求解 1.5 结果查看 1.6 结果分析 2 音叉能否释放频率440Hz的音调 3 预应力模态求解 3.1 静态结构分析 3.1.1 添加静态结构项目 3.1.2生成网格 3.1.3添加边界条件 3.1…...
智慧园区系统集成解决方案引领未来城市管理的智能化转型
内容概要 在现代城市管理的背景下,“智慧园区系统集成解决方案”正扮演着越来越重要的角色。这种解决方案不仅仅是技术上的创新,更是一种全新的管理理念,它旨在通过高效的数据整合与分析,优化资源配置,提升运营效率。…...
(即插即用模块-特征处理部分) 二十、(TPAMI 2022) Permute-MLP 置换MLP模块
文章目录 1、Permute-MLP layer2、代码实现 paper:Vision Permutator: A Permutable MLP-Like Architecture for Visual Recognition Code:https://github.com/Andrew-Qibin/VisionPermutator 1、Permute-MLP layer 传统的 MLP-like 模型(如…...
FBX SDK的使用:基础知识
Windows环境配置 FBX SDK安装后,目录下有三个文件夹: include 头文件lib 编译的二进制库,根据你项目的配置去包含相应的库samples 官方使用案列 动态链接 libfbxsdk.dll, libfbxsdk.lib是动态库,需要在配置属性->C/C->预…...
爬虫基础(二)Web网页的基本原理
一、网页的组成 网页由三部分构成:HTML、JavaScript、CSS。 (1)HTML HTML 相当于网页的骨架,它通过使用标签来定义网页内容的结构。 举个例子: 它把图片标签为img、把视频标签为video,然后组合到一个界面…...
1.4 Go 数组
一、数组 1、简介 数组是切片的基础 数组是一个固定长度、由相同类型元素组成的集合。在 Go 语言中,数组的长度是类型的一部分,因此 [5]int 和 [10]int 是两种不同的类型。数组的大小在声明时确定,且不可更改。 简单来说,数组…...
爬虫基础(三)Session和Cookie讲解
目录 一、前备知识点 (1)静态网页 (2)动态网页 (3)无状态HTTP 二、Session和Cookie 三、Session 四、Cookie (1)维持过程 (2)结构 正式开始说 Sessi…...
hive:基本数据类型,关于表和列语法
基本数据类型 Hive 的数据类型分为基本数据类型和复杂数据类型 加粗的是常用数据类型 BOOLEAN出现ture和false外的其他值会变成NULL值 没有number,decimal类似number 如果输入的数据不符合数据类型, 映射时会变成NULL, 但是数据本身并没有被修改 创建表 创建表的本质其实就是在…...
Maya软件安装步骤与百度网盘链接
软件简介: MAYA软件是Autodesk旗下的著名三维建模和动画软件。maya软件功能更为强大,体系更为完善,因此国内很多的三维动画制作人员都开始转向maya,maya软件已成为三维动画软件的主流。 百度网盘链接: https://pan.baidu.com/s…...
error: RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054
Descriptions: Solutions:...
PID算法的数学实现和参数确定方法
目录 概述 1 算法描述 1.1 PID算法模型 1.2 PID离散化的图形描述 1.3 PID算法的特点 2 离散化的PID算法 2.1 位置式PID算法 2.2 增量式PID算法 2.3 位置式PID与增量式PID比较 3 控制器参数整定 3.1 PID参数确定方法 3.1.1 凑试法 3.1.2 临界比例法 3.1.3 经验法…...
【已解决】ECharts 没有在页面生效
元素高度问题: ECharts 需要一个具有明确高度的容器来渲染图表,也就是说 echartsRef 元素需要一个明确的 div 高度。我项目中的问题就是在 .base-echarts(我项目中的最外层元素) 上设置了高度为 300px,但没有为 .echar…...
三角函数正交性应用--以信号分离为例
三角函数的正交性的应用 引言 在信号处理、通信等众多领域中,三角函数的正交性发挥着至关重要的作用。它不仅是理论分析的基础,更是实际应用中解决各种问题的有力工具。本文将详细介绍三角函数正交性的定义、证明,并通过一个具体的信号处理…...
ASP.NET Core 中使用依赖注入 (DI) 容器获取并执行自定义服务
目录 一、ASP.NET Core 中使用依赖注入 (DI) 容器获取并执行自定义服务 1. app.Services 2. GetRequiredService() 3. Init() 二、应用场景 三、依赖注入使用拓展 1、使用场景 2、使用步骤 1. 定义服务接口和实现类 2. 注册服务到依赖注入容器 3. 使用依赖注入获取并…...
一个数如果恰好等于他的因子之和,这是就成为“完数“,例如6=1+2+3.编程找出1000以内的所有完数
from sys import stdoutfor i in range(2,1001):k[] #用于存储因子si #初始化s为当前数字ifor j in range(1,i):if i%j0: #如果j是i的因子s-j #从s中减去银子jk.append(j) #将因子j加入列表kif s0:#如果s最终为0,说明i是一个完数print(i)for j in range(len(k)): #遍历银子列表…...
理解 InnoDB 如何处理崩溃恢复
在数据库领域,数据的一致性与可靠性至关重要。InnoDB 存储引擎的崩溃恢复机制是保障数据安全的核心,其中 Doublewrite Buffer 和 Redo Log 发挥着关键作用。下面,我们将详细探讨 InnoDB 从写入到崩溃恢复的全过程。 一、写入流程 修改页面&…...
Linux-CentOS的yum源
1、什么是yum yum是CentOS的软件仓库管理工具。 2、yum的仓库 2.1、yum的远程仓库源 2.1.1、国内仓库 国内较知名的网络源(aliyun源,163源,sohu源,知名大学开源镜像等) 阿里源:https://opsx.alibaba.com/mirror 网易源:http://mirrors.1…...
Redis复制
一、Redis复制: 1.为了解决分布式中单点故障问题,通常会把数据复制多个副本部署到其他机器上来解决故障恢复和负载均衡等需求。 2.建立复制 参与复制的redis实例划分为主节点(master)和从节点(slave),每个从…...
小白怎样部署和使用本地大模型DeepSeek ?
1 安装Ollama (1) 下载Ollama 从https://ollama.com/download 下载, 根据你的系统下载对应的版本,支持Win, Mac ,Linux: 如果下载不了,右键复制链接地址,贴到迅雷,指定可以下载下来。 (2) 安…...
ECharts 样式设置
ECharts 样式设置 引言 ECharts 是一款功能强大的可视化库,广泛用于数据可视化。样式设置是 ECharts 中的重要一环,它能够帮助开发者根据需求调整图表的视觉效果,使其更加美观和易于理解。本文将详细介绍 ECharts 的样式设置,包…...
Java synchronized关键字和锁分类
专栏系列文章地址:https://blog.csdn.net/qq_26437925/article/details/145290162 本文目标: 关于synchronized已经有很多博主很细致的讲解了,本文主要是通过代码例子再次理解下,并要求能头脑反射出相关知识点主要是锁分类的知识…...
Vue.js 新的生命周期钩子:`onMounted`, `onUpdated` 等
Vue.js 新的生命周期钩子:onMounted, onUpdated 等 今天我们来聊聊 Vue 3 中的生命周期钩子,特别是 onMounted、onUpdated 等。如果你对如何在 Vue 3 的组合式 API(Composition API)中使用这些钩子感到困惑,那么这篇文…...
OpenCV:闭运算
目录 1. 简述 2. 用膨胀和腐蚀实现闭运算 2.1 代码示例 2.2 运行结果 3. 闭运算接口 3.1 参数详解 3.2 代码示例 3.3 运行结果 4. 闭运算的应用场景 5. 注意事项 相关阅读 OpenCV:图像的腐蚀与膨胀-CSDN博客 OpenCV:开运算-CSDN博客 1. 简述…...
Android 音视频编解码 -- MediaCodec
引言 如果我们只是简单玩一下音频、视频播放,那么使用 MediaPlayer SurfaceView 播放就可以了,但如果想加个水印,加点其他特效什么的,那就不行了; 学习 Android 自带的硬件码类 – MediaCodec。 MediaCodec 介绍 Med…...
移动互联网用户行为习惯哪些变化,对小程序的发展有哪些积极影响
一、碎片化时间利用增加 随着生活节奏的加快,移动互联网用户的碎片化时间越来越多。在等公交、排队、乘坐地铁等间隙,用户更倾向于使用便捷、快速启动的应用来满足即时需求。小程序正好满足了这一需求,无需下载安装,随时可用&…...
数据分析系列--②RapidMiner导入数据和存储过程
一、下载数据 二、导入数据 1. 在本地计算机中创建3个文件夹 2. 从本地选择.csv或.xlsx 三、界面说明 四、存储过程 1.保存 Congratulations, you are done. 一、下载数据 点击下载AssociationAnalysisData.xlsx数据集 二、导入数据 1. 在本地计算机中创建3个文件夹 2. 从…...
Prometheus 中的 Exporter
在 Prometheus 生态系统中,Exporter 扮演着至关重要的角色,它们负责从不同的服务或系统中收集和暴露度量数据。本文将详细介绍 Exporter 的概念、类型以及如何有效使用它们将 Prometheus 集成到各种系统中进行监控。 什么是 Exporter? Exporter 是一段软件,它从应用程序或…...
从 HTTP/1.1 到 HTTP/3:如何影响网页加载速度与性能
一、前言 在最近使用Apipost时,突然注意到了http/1.1和http/2,如下图: 在我根深蒂固的记忆中,对于http的理解还停留在TCP协议、三次握手。由于我的好奇心,于是触发了我被动“开卷”,所以有了这篇文章&…...
GenAI 在金融服务领域的应用:2025 年的重点是什么
作者:来自 Elastic Karen Mcdermott GenAI 不是魔法 我最近参加了 ElasticON,我们与纽约 Elastic 社区一起度过了一天,讨论了使用检索增强生成 (retrieval augmented generation - RAG) 为大型语言模型 (large language models - LLMs) 提供…...
小红书文案生成器(基于openai API和streamlit)
prompt_text.py: # 专门用来放提示文本(系统提示、用户提示)system_prompt_text """ 你是小红书爆款写作专家,请你遵循以下步骤进行创作:首先产出5个标题(包含适当的emoji表情)…...
Spring AOP 入门教程:基础概念与实现
目录 第一章:AOP概念的引入 第二章:AOP相关的概念 1. AOP概述 2. AOP的优势 3. AOP的底层原理 第三章:Spring的AOP技术 - 配置文件方式 1. AOP相关的术语 2. AOP配置文件方式入门 3. 切入点的表达式 4. AOP的通知类型 第四章&#x…...