隐式类型转换 算术转换 操作符的属性

简介: 隐式类型转换 算术转换 操作符的属性

隐式类型转换

c的整形算术运算总是至少以缺省整型类型的精度来计算的

为了获得这个精度,变浓的是的字符和短整型的操作数在被使用前被转换为普通型,这中类型转化被称为整型提升

整形提升的意义:

表达式的整形运算实在cpu的相应的运算器内执行,cpu内整形运算的操作数的字节长度一般就是int长度的字节,同时也是cpu内整形操作数的标准长度

因此。即使两个字符类型相加,在cpu执行时实际也是先转化为cpu内整型操作数的标准长度。

通用cpu是难以直接实现两个8比特字节的直接相加运算。所以表达式各种长度小于int长度的整型值,都必须先转化为int或unsigned int才能进入cpu内运算。

如:char a, b, c;

.....

a = b+c;

这里的b和c先会被提升到普通整行时再参与计算。加运算结束后。结果将会被截断,然后再执行加法运算。

如何进行整型提升呢?

整型提升按照变量的数据类型的符号位来提升的。  高位补充符号位  无符号整型提升高位补零。

int main()
{
  char a = 3;
  //00000000000000000000000000000011
  //00000011--截断
  char b = 1237;
  //00000000000000000000000001111111
  //01111111--截断
  char c = a + b;
  //00000000000000000000000100000010
  //10000010--c 只取八位
  //整型提升
  printf("%d", c);
  //11111111111111111111111110000010
  //11111111111111111111111110000001
  //10000000000000000000000001111110
  //-126
  return 0;
}

一般会发生的整型提升的例子:

int main()
{
  //char 的范围-128~127
 //unsigned char
  char a = 0xb6;
  short b = 0xb600;
  int c = 0xb6000000;
  if (a == 0xb6)
    printf("a");
  if (b == 0xb600)
    printf("b");
  if (c == 0xb6000000)
    printf("c");
    //只有c打印,a与b都需要整形提升,提升之后值改变
  return 0;
}

整型提升,值发生了变化。

int main()
{
  char c = 1;
  char d = 2;
  printf("%u\n", sizeof(c));//1
  printf("%u\n", sizeof(+c));//4
  printf("%u\n", sizeof(-c));//4
  printf("%u\n", sizeof(c+d));//4
  //整形提升
  return 0;
}

我们可以根据数据类型来判断整型提升是存在的。

算术转换

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

long double

double

float;

unsigned long int

long int

unsigned int

int

如果一个数的类型在上面的列表很低,则它需要转化到另一个操作数的类型。

但是算数转化要合理。

float f = 3.14;
int num = f;//精度丢失

操作符的属性

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

1.操作符的优先级

2.操作符的结核性

3.是否控制求值顺序

表达式的求值部分由操作符的优先级决定

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

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

比如在这个函数调用,你如何去判断到底哪一个先去调用,这是不可预测的,值就不得而知。

目录
打赏
0
0
0
0
13
分享
相关文章
Argo Workflows at KubeCon Europe 2025: 多元场景的云原生任务编排
Argo Workflow在KubeCon Europe 2025展示了其在AI/ML/HPC任务、事件驱动、平台工程、批量数据处理、混沌测试等多元场景的云原生任务编排能力。
【自定义插件系列】用自定义插件在阿里云百炼上生成一篇图文并茂的文章
本文介绍了如何在阿里云百炼平台上利用自定义插件生成图文并茂的文章。通过大模型生成小红书风格的文章,提取关键元素生成图像提示词,结合文生图插件生成图片,并最终整合文本与图像输出给用户。整个流程包括多个步骤:从创建对话型工作流开始,经过多次大模型处理、脚本转换和自定义插件操作,到最后完成图文混排的输出。
506 56
设计行业如何借助协作软件提升团队协作力?
随着设计项目规模和复杂性的增加,设计行业越来越依赖协作软件来提高工作效率、加强团队协作、支持远程办公、实现文件版本控制等,确保项目高效推进。协作软件不仅优化了设计流程,还促进了创意交流和团队创新。
利用AI技术提升文本分类效率
【8月更文挑战第73天】在信息爆炸的时代,文本数据的快速增长使得文本分类成为数据处理的重要环节。本文将介绍如何利用AI技术提升文本分类的效率和准确性,包括数据预处理、模型选择与训练以及结果评估等关键环节。通过实际案例的代码示例,我们将展示如何实现一个高效的文本分类系统。
Android经典实战之使用ViewCompat来处理View兼容性问题
本文介绍Android中的`ViewCompat`工具类,它是AndroidX库核心部分的重要兼容性组件,确保在不同Android版本间处理视图的一致性。文章列举了设置透明度、旋转、缩放、平移等功能,并提供了背景色、动画及用户交互等实用示例。通过`ViewCompat`,开发者可轻松实现跨版本视图操作,增强应用兼容性。
277 5
如何选择好用的BI平台?BI报表管理与BI可视化平台功能优势比拼!
杭州奥零数据科技有限公司成立于2023年,专注于数据中台业务,维护开源项目AllData并提供商业版解决方案。AllData提供数据集成、存储、开发、治理及BI展示等一站式服务,支持AI大模型应用,助力企业高效利用数据价值。
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
文章详细介绍了Spring、IOC、DI的概念和关系,解释了控制反转(IOC)和依赖注入(DI)的原理,并提供了IOC的代码示例,阐述了Spring框架作为IOC容器的应用。
488 1
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
【C语言篇】编译和链接以及预处理介绍(上篇)1
【C语言篇】编译和链接以及预处理介绍(上篇)
86 1
移动应用与系统:探索移动开发与操作系统的协同进化####
当今数字化时代,移动设备已成为日常生活不可或缺的一部分。本文旨在深入探讨移动应用开发与移动操作系统之间的紧密关系及其相互影响,揭示技术创新如何推动这一领域的发展。通过分析当前主流移动操作系统的特点、移动应用的开发趋势以及两者间的互动机制,本文为开发者和用户提供了一个全面了解该领域的窗口。 ####
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等