表达式求值

整型提升

C语言中整型算术运算总是**至少以**`**int**`**整型类型的精度**来进行的。

为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。

整型提升的意义:

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

因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。

通用CPU(general-purpose CPU)是难以直接实现两个字节直接相加运算(虽然机器指令中能有这种字节相加指令)。所以,表达式中各种长度可能小于**int**长度的整型值,都必须先转换为**int****unsigned int**,然后才能送入CPU去执行运算。

如何进行整体提升

  1. 有符号整数提升:是按照变量的数据类型的符号位来提升
  2. 无符号整数提升:高位补0
//负数的整型提升
char c1 = -1;
//11111111——c1的补码
//11111111 11111111 11111111 11111111——整型提升后c1的补码
//正数的整型提升
char c1 = 1;
//00000001——c1的补码
//00000000 00000000 00000000 00000001——整型提升后c1的补码
#include<stdio.h>
int main()
{
	char c1 = 5;
	char c2 = 126;
	//00000101——c1的补码
	//01111110——c2的补码
	//00000000 00000000 00000000 00000101——整型提升后c1的补码
	//00000000 00000000 00000000 01111110——整型提升后c2的补码
	//00000000 00000000 00000000 10000011——相加
	//10000011——c3的补码
	//11111101——c3的原码—— -125
	char c3 = c1 + c2;
	printf("%d", c3);//输出 -125
	return 0;
}

画板

算术转换

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

下面的层次体系称为寻常算术转换

long double
double
float
unsigned long int
long int
unsigned int
int

如果某个操作数的类型在上面这个列表中排名靠后,那么首先要转换为另外一个操作数的类型后执行运算。

float a;
double b;
b = b + a;//a 先转换为 double类型,再计算

问题表达式解析

表达式1
a * b + c * d + d * e;

表达式1在计算的时候,由于*+的优先级高,只能保证,第一个* 的计算是比第一个+ 早,但是优先级并不能决定第三个* 比第一个+ 早执行。

表达式2
c + -- c

操作符的优先级只能决定-- 的运算在+ 的运算的前面,但是我们并没有办法得知,+ 操作符的左操作数的获取在右操作数之前还是之后,所以结果是不可预测的,是有歧义的。

表达式3
#include<stdio.h>

int fun()
{
	static int i = 1;
	return ++i;
}

int main()
{
	int answer;
	answer = fun() - fun() * fun();
	printf("%d", answer);
	return 0;
}

虽然这串代码在大多数的编译器上求得结果都是相同的。

但是上述代码 answer = fun() - fun() * fun(); 中我们只能通过操作符的优先级得知:先算乘法,再算减法。函数的调用先后顺序无法通过操作符的优先级确定。

表达式 4
#include<stdio.h>

int main()
{
	int i = 1;
	int ret = (++i) + (++i) + (++i);
	printf("%d", ret);
	printf("%d", i);
	return 0;
}

这段代码中的第一个+ 在执行的时候,第三个++是否执行,这个是不确定的,因为依靠操作符的优先级和结合性是无法决定第一个+ 和第三个前置++ 的先后顺序。

总结

即使有了操作符的优先级和结合性,我们写出的表达式依然有可能不能通过操作符的属性确定唯一的计算路径,那这个表达式就是存在潜在风险的,建议不要写出特别负责的表达式。

内容概要:本资源聚焦于配电网在发生故障后的两阶段鲁棒恢复研究,旨在提升电力系统在不确定性条件下的恢复能力与运行可靠性。研究采用两阶段优化方法,第一阶段进行预恢复决策,如网络重构、分布式电源出力调整等,以最小化预期损失;第二阶段则针对实际发生的故障场景实施校正控制,利用鲁棒优化理论应对负荷波动、新能源出力不确定性等因素,确保恢复方案的可行性与强健性。资源提供了完整的Matlab代码实现,复现了相关顶刊研究成果,便于使用者深入理解模型构建、算法求解及仿真分析全过程。; 适合人群:具备电力系统分析、优化理论基础及Matlab编程能力的研究生、科研人员及电力行业工程师。; 使用场景及目标:① 学习并掌握配电网故障恢复的先进优化方法,特别是两阶段鲁棒优化模型的构建与应用;② 复现和验证顶刊论文中的算法,为自身科研工作提供技术参考和代码基础;③ 将所学方法拓展应用于微电网、主动配电网等新型电力系统的可靠性评估与优化调度研究。; 阅读建议:学习者应结合提供的Matlab代码,仔细研读模型的数学公式与求解逻辑,重点关注不确定性建模、两阶段决策变量的设定以及鲁棒对等转换技巧。建议在掌握基础案例后,尝试修改参数或引入新的约束条件进行扩展研究,以深化理解并提升创新能力。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值