【表达式求值】整型提升和算术转换

这篇具有很好参考价值的文章主要介绍了【表达式求值】整型提升和算术转换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1. 整型提升

1.1整型提升的意义:

1.2如何进行整体提升呢?

2. 算术转换

3. 问题表达式解析

3.1 表达式1

3.2 表达式2

3.3 表达式3

3.4 表达式4

4. 操作符属性

​ 总结:


1. 整型提升

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

1.1整型提升的意义:

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

实例1:

char a,b,c;
...
a = b + c;

b和c的值被提升为普通整型,然后再执行加法运算。
加法运算完成之后,结果将被截断,然后再存储于a中。

1.2如何进行整体提升呢?

  1. 有符号整数提升是按照变量的数据类型的符号位来提升的
  2. 无符号整数提升,高位补0
//负数的整形提升
char c1 = -1;
变量c1的⼆进制位(补码)中只有8个⽐特位:
1111111
因为 char 为有符号的 char
所以整形提升的时候,⾼位补充符号位,即为1
提升之后的结果是:
11111111111111111111111111111111
//正数的整形提升
char c2 = 1;
变量c2的⼆进制位(补码)中只有8个⽐特位:
00000001
因为 char 为有符号的 char
所以整形提升的时候,⾼位补充符号位,即为0
提升之后的结果是:
00000000000000000000000000000001
//无符号整形提升,⾼位补0

2. 算术转换

        如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另以个操作数的类型,否则操作就无法进行。下面的层次体系称为寻常算术转换

//操作类型若不同,采用从下至上的   小类型—>大类型

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

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

如:

char —> double分两步:

  1. char—>int 
  2. int —>double

3. 问题表达式解析

3.1 表达式1

//表达式的求值部分由操作符的优先级决定。
//表达式1
a*b + c*d + e*f

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

第一种:

  1. a*b
  2. c*d
  3. a*b + c*d
  4. e*f
  5. a*b + c*d + e*f

第二种:

  1. a*b
  2. c*d
  3. e*f
  4. a*b + c*d
  5. a*b + c*d + e*f 

         对于这种代码,容易产生错误。所以,在我们自己写的时候,可以加上()来确定顺序,这样就是唯一计算顺序了。

【表达式求值】整型提升和算术转换,C语言,算法

3.2 表达式2

//表达式2
c + --c;

同上,操作符的优先级只能决定自减 -- 的运算在 + 的运算的前面,但是我们并没有办法得知, + 操作符的左操作数的获取是在右操作数之前还是之后求值(即不知道第一个c是--之后的值还是之前的值)所以结果是不可预测的,是有歧义的。

3.3 表达式3

//表达式3
int main()
{
    int i = 10;
    i = i-- - --i * ( i = -3 ) * i++ + ++i;
    printf("i = %d\n", i);
    return 0;
}


表达式3在不同编译器中测试结果:非法表达式程序的结果【表达式求值】整型提升和算术转换,C语言,算法 

3.4 表达式4

#include <sdtio.h>
int fun()
{
	static int count = 1;
	return ++count;
}
int main()
{
	int answer;
	answer = fun() - fun() * fun();
	printf("%d\n", answer); //输出多少?
	return 0;
}

这个代码有没有实际的问题?有问题!
虽然在大多数的编译器上求得结果都是相同的。
但是上述代码 answer = fun() - fun() * fun(); 中我们只能通过操作符的优先级得知:先
算乘法,再算减法。
函数的调用先后顺序无法通过操作符的优先级确定。

4. 操作符属性

 总结:

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

只有一点小小归纳,希望能帮到大家!

如果大家发现知识点错误的话,请帮忙指出,十分感谢!!

也请大家帮忙点赞、评论,这将督促我前行,大家一起加油!!!

【表达式求值】整型提升和算术转换,C语言,算法

【表达式求值】整型提升和算术转换,C语言,算法文章来源地址https://www.toymoban.com/news/detail-834337.html

到了这里,关于【表达式求值】整型提升和算术转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 北京林业大学数据结构实验二 基于栈的算术表达式求值算法

    参见课本P75 例3.3

    2024年02月06日
    浏览(48)
  • 【 第1关:基于栈的中缀算术表达式求值】【编程题实训-栈】【头歌】【bjfu-240】

    本关任务:输入一个中缀算术表达式,求解表达式的值。运算符包括+、-、*、/、(、)、=,参加运算的数为double类型且为正数。(要求:直接针对中缀算术表达式进行计算,不能转换为后缀或前缀表达式再进行计算,只考虑二元运算即可。) 输入 多组数据,每组数据一行,对

    2024年02月06日
    浏览(54)
  • 算术表达式:前缀、中缀表、后缀表达式相互转换

    概念: 三者的区别在于运算符相对于操作数的位置有所不同   前缀表达式 前缀表达式是一种没有括号的算术表达式,与中缀表达式不同的是,其将运算符写在前面,操作数写在后面。   中缀表达式  中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于

    2024年02月05日
    浏览(93)
  • 表达式求值和转换

    2024年02月06日
    浏览(37)
  • C语言-用栈实现表达式求值

    目录 目的描述: 算法的基本思想: 错误点: 完整代码: 1.输入输出 2.栈操作函数包(数组堆栈.h) 3.实现表达式求值函数包(表达式求值.c) 4.测试输出: 算符优先算法要实现的是,根据运算优先关系来对一个表达式求值,假如说要计算: 4+2*3-10/5 运算的顺序例如: 4+ 2*

    2023年04月10日
    浏览(50)
  • 【初阶C语言】操作符2---表达式求值

    前言:本节重点介绍操作符的使用,如,优先级高低、类型转换等 前言:逻辑操作符包括 逻辑与() 和 逻辑或(||) ,操作对象:两个 1.逻辑与() (1)定义 的字面意思就是并且。如:AB,需要A和B同时成立,整体才成立。 (2)图形解释  0表示假,所以需要A和B同时满足

    2024年02月09日
    浏览(51)
  • Go基础12-理解Go语言表达式的求值顺序

    Go语言在变量声明、初始化以及赋值语句上相比其先祖C语言做了一些改进,诸如: ● 支持在同一行声明和初始化多个变量(不同类型也可以) ● 支持在同一行对多个变量进行赋值 这种语法糖在给我们带来便利的同时,也可能带来一些令人困惑的问题。 Go语言之父Rob Pike在

    2024年02月09日
    浏览(58)
  • 【数据结构】利用顺序栈/链栈完成表达式求值(C语言实现)

    利用顺序栈完成表达式求值(将字符型转换为整型) 程序代码: #include stdio.h #include malloc.h #include stdlib.h #include math.h #define MAXSIZE 100 #define ElemType char #define LEN sizeof ( ElemType ) typedef struct {     ElemType * data;     int top; } SqStack ; void InitStack( SqStack * S ) {     S -data = ( ElemType *)

    2024年02月05日
    浏览(55)
  • 初始C语言(6)——详细讲解表达式求值以及其易错点

     第一章 “C“浒传——初识C语言(1)(更适合初学者体质哦!)  第二章 初始C语言(2)——详细认识分支语句和循环语句以及他们的易错点   第三章 初阶C语言(3)——特别详细地介绍函数  第四章 初始C语言(4)——详细地讲解数组的内容以及易错点  第五章 初

    2024年02月12日
    浏览(37)
  • 【数据结构】超详细讲解:算术表达式转化为后缀表达式、前缀表达式、表达式树的构建

    作者: 努力学习的大一在校计算机专业学生,热爱学习和创作。目前在学习和分享:算法、数据结构、Java等相关知识。 博主主页: @是瑶瑶子啦 所属专栏: 【数据结构】:该专栏专注于数据结构知识,持续更新,每一篇内容优质,浅显易懂,不失深度! 近期目标: 写好专栏

    2024年02月08日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包