C语言整型提升、算术转换、操作符的属性

news/2024/11/30 9:39:01/

C语言整型提升、算术转换、操作符的属性


整型提升

  C语言在进行整型算术运算时,总是把字符型、短整型操作数在使用之前转换为普通整型参与运算。
  整型提升是按照数据类型的符号位来提升的,正数补0,负数补1。如果是无符号的数,高位也是补0。


整型提升的意义:

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


例子:

char a = 10;
00000000 00000000 00000000 00001010  //整型提升
00001010 //a的补码,发生截断只能保存一个字节数据
char b = 125;
00000000 00000000 00000000 01111101	//整型提升
01111101 //b的补码,发生截断只能保存一个字节数据
char res = a + b;
// 整型提升
00000000 00000000 00000000 00001010 
00000000 00000000 00000000 01111101 
00000000 00000000 00000000 10000111 //a + b的结果
//发生截断 res实际存的值是 10000111
printf("%d" , res);
// 整型提升
11111111 11111111 11111111 10000111
11111111 11111111 11111111 10000110
10000000 00000000 00000000 01111001
// 最终结果是 -121

#include <stdio.h>int main() {char num = 10;/*第一个printf里的num没有参与运算,所以没有整型提升第二个以及第三个printf都是一个表达式,参与运算会整型提升,所以是4个字节*/printf("%d\n", sizeof(num));  // 1printf("%d\n", sizeof(+num)); // 4printf("%d\n", sizeof(-num)); // 4return 0;
}

算术转换(自动类型转换)

  1.在进行运算时,不同类型的数据要先转换成相同类型在进行运算。
  2.精度低的数据类型向精度高的数据类型转换。

必做的转换

char -> int
short -> int
float -> double

运算对象的类型不同,由低向高转换

int -> unsigned int -> long -> unsigned long -> float -> double -> long double

例子:

int main () {int a = 10;short b = 20;float c = 1.5;double d = 5.6;printf("%lf" , a + b - c / d); // 这个表达式最后的类型是doublereturn 0;
}

操作符的属性

运算符名称或含义使用形式结合方向
()圆括号(表达式)
函数名(形参)
左到右
[]下标引用数组名[常量表达式]左到右
.结构体访问成员结构体.成员左到右
->结构体指针访问成员结构体指针->成员左到右
-负号运算符-表达式右到左
+正号运算符-表达式右到左
++自增运算符++表达式
表达式++
右到左
- -自增运算符–表达式
表达式–
右到左
*解引用运算符*指针变量右到左
&取地址运算符&变量名右到左
!逻辑非运算符!表达式右到左
~按位取反运算符~表达式右到左
sizeof判断类型、变量字节数sizeof(表达式)右到左
(类型)强制类型转换(类型)变量右到左
/表达式/表达式左到右
*表达式*表达式左到右
%取模表达式%表达式左到右
+表达式+表达式左到右
-表达式-表达式左到右
<<左移表达式<<表达式左到右
>>右移表达式>>表达式左到右
>大于表达式>表达式左到右
>=大于等于表达式>=表达式左到右
<小于表达式<表达式左到右
<=小于等于表达式<=表达式左到右
==等于表达式==表达式左到右
!=不等于表达式!=表达式左到右
&按位与表达式&表达式左到右
^按位异或表达式^表达式左到右
|按位或表达式|表达式左到右
&&逻辑与表达式&&表达式左到右
||逻辑或表达式||表达式左到右
?:条件运算符表达式1?表达式2:表达式3右到左
=赋值运算符变量=表达式右到左
+=加赋值运算符变量+=表达式右到左
-=减赋值运算符变量-=表达式右到左
*=乘赋值运算符变量*=表达式右到左
/=除赋值运算符变量/=表达式右到左
%=模赋值运算符变量%=表达式右到左
<<=左移赋值运算符变量<<=表达式右到左
>>=右移赋值运算符变量>>=表达式右到左
&=按位与赋值运算符变量&=表达式右到左
^=按位异或赋值运算符变量^=表达式右到左
|=按位或赋值运算符变量|=表达式右到左
,逗号运算符(表达式,表达式,表达式,…)左到右

注:即使我们知道了操作符的优先级和结合性,但是对于一些奇怪的表达式,根据计算路径的不一致,我们依然求不出唯一值。


http://www.ppmy.cn/news/234413.html

相关文章

【Matlab风电功率预测】麻雀算法优化BP神经网络风电功率预测【含源码 1319期】

一、代码运行视频&#xff08;哔哩哔哩&#xff09; 【Matlab风电功率预测】麻雀算法优化BP神经网络风电功率预测【含源码 1319期】 二、matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]张启龙,王立威.基于遗传算法优化BP神经网络模型的风电功率预测[J]. 电子测试…

用matlab画效率图时,如何让去除外特性以外部分的等高线?

最近在做汽车能量管理的相关项目&#xff0c;需要将发动机&电机的工作点在map图上表示出来&#xff0c;peace of cake&#xff0c;在拿到工作点的数据以及发动机油耗数据&电机效率数据以后&#xff0c;我很快将他们处理出来&#xff0c;于是得到下面的图&#xff1a; &…

【SVM分类】基于支持向量机实现电力节点分类附matlab代码

1 简介 2 部分代码 function mpc = case39 %CASE39 Power flow data for 39 bus New England system. % Please see CASEFORMAT for details on the case file format. % Data taken from [1] with the following modifications/additions: % % - renumbered gen bu…

tpx色卡电子版_潘通色卡电子版Pantone TPX(新175色)

页数色号颜色颜色名称 N0115-3800TPXPorpoise N0116-3800TPXSatelliet N0118-1210TPXDriftwood N0118-1304TPXFalcon N0119-0808TPXMorel N0118-1108TPXFallen Rock N0116-0205TPXVintage Khaki N0216-1104TPXCrockery N0216-1109TPXGreige N0217-1311TPXDesert Taupe N0215-13…

单片机蜂鸣器的控制程序与驱动电路图

蜂鸣器从结构区分分为压电式蜂鸣器和电磁式蜂鸣器。压电式为压电陶瓷片发音&#xff0c;电流比较小一些&#xff0c;电磁式蜂鸣器为线圈通电震动发音&#xff0c;体积比较小。按照驱动方式分为有源蜂鸣器和无源蜂鸣器。这里的有源和无源不是指电源&#xff0c;而是振荡源。有源…

Linux 系统Candy

0.GDB调试技巧 GDB 反编译内存,没有符号信息的情况下,有x指令和disas 指令两种方式: Linux idle task callstack POSION头文件: linux的异常表是在哪里建立的? 首先在连接脚本中的符号__vectors_start: 然后,在将vectors的内存映射到0XFFFF0000 ARM向量地址:

图神经网络实战案例-新冠疫苗项目实战,助力疫情!

Kaggle新冠疫苗研发竞赛 https://www.kaggle.com/c/stanford-covid-vaccine/overview mRNA疫苗已经成为2019冠状病毒最快的候选疫苗&#xff0c;但目前它们面临着关键的潜在限制。目前最大的挑战之一是如何设计超稳定的RNA分子(mRNA)。传统疫苗是装在注射器里通过冷藏运输到世界…

单相逆变电路实战!(基于STM32F103C8T6的单相逆变电路,PID控制输出额定电压)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、所需要的主要器件二、硬件电路图1.单相逆变主电路2.继电器过流过压保护3.辅助电源供电4.IR2104驱动 三、软件流程图1.Visio流程图2.主函数3.定时器中断函数…