当前位置: 首页 > news >正文

C语言 — 整型提升和算数转换

一.什么是整形提升?

CPU内整形运算器的操作数的字节长度,一般是 int 类型的长度 。C的整数运算总是以整型类型的进度来进行的。为了获取这个精度,表达式中字符短整型操作数在使用之前被转换为普通整形,这种转换称为整形提升

二.怎么进行整形提升?

规则:整形提升是按照变量的数据类型的符号位来提升

负数的整形提升

char c1 = -1;

变量c1的二进制补码中,只有8个比特位,即1111 1111

怎么得到这个结果的?

-1 是整数,即 4个字节 32个比特位.

-1的原码:1000 0000 0000 0000 0000 0000 0000 0001

-1的反码:1111 1111 1111 1111 1111 1111 1111 1110

-1的补码:1111 1111 1111 1111 1111 1111 1111 1111

因为c1只有8个比特位,放不下一个整形(32个比特位),此时就会发生截断只把最后面的8个比特位放进c1里。

c1的整形提升:c1是有符号char, 整形提升的时候 ,最高位补充符号位 1 。

即 1111 1111 1111 1111 1111 1111 1111 1111

正数的整形提升

char c2 = 1;

变量c2的二进制补码中,只有8个比特位,即0000 0001。

怎么得到这个结果的?

1 是整数,即 4个字节 32个比特位。因为是正数原码反码补码都是一样的。

1 的补码:0000 0000 0000 0000 0000 0000 0000 0001

因为c2只有8个比特位,放不下一个整形(32个比特位),此时就会发生截断只把最后面的8个比特位放进c1里。

c1的整形提升:c1是有符号char, 整形提升的时候 ,最高位补充符号位 0 。

即 0000 0000 0000 0000 0000 0000 0000 0001

无符号数

无符号数整型提升,最高位补0。

三.整形提升的示例

int main() { char a = 5; char b = 126; char c = a + b; printf("%d\n", c); return 0; }

这个代码运行的结果是什么呢?

下面来分析:

5 是正数,原反补都一样。

5 的补码:0000 0000 0000 0000 0000 0000 0000 0101

然后截断最后8个比特位,a里存放 0000 0101。

126 的补码:0000 0000 0000 0000 0000 0000 0111 1110

截断最后8个比特位,b里存放 0111 1110。

在这个表达式中 c = a + b ,a 和 b 是达不到一个整形的大小,整形提升。

0000 0000 0000 0000 0000 0000 0000 0101

0000 0000 0000 0000 0000 0000 0111 1110

整型提升后执行运算。

结果 :0000 0000 0000 0000 0000 0000 1000 0011

运算完,截断,存放1000 0011 。

最后打印的是%d (打印整形)这个时候,又整形提升这次最高位是 1

整型提升的结果:1111 1111 1111 1111 1111 1111 1000 0011

还没完,这次得到的整形提升的结果是补码。

-1 得到反码1111 1111 1111 1111 1111 1111 1000 0010

取反得到原码1000 0000 0000 0000 0000 0000 0111 1101

如果把这个补码放到程序员计算器里,就会最终得到这个数字:-125

这里还有一个例子

int main() { char c1 = 1; short c2 = 1; printf("%u\n", sizeof(c1)); printf("%u\n", sizeof(c2)); printf("%u\n", sizeof(+c1)); printf("%u\n", sizeof(+c2)); printf("%u\n", sizeof(-c1)); printf("%u\n", sizeof(-c2)); }

这种 +c1(c2)和 -c1(c2) 也是表达式,计算大小的时候也会发生整形提升。

四.什么是算数转换?

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

和整形提升不的是,整形提升都是< int 的数据类型。而>= int 是算术转换的数据类型

寻常算术转换的层次体系

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

例如:

操作数是float 类型 和 double 类型的时候,float 就会转换为double 进行运算

如果某个操作数的类型在上面的排行中,次位较低,要转换为另一个操作数的类型后进行运算。但是算术转换要合理,不然会有丢失进度的风险。

例如:

float f = 3.14; int num = f; //会有进度的丢失

看到这里不知道你对整形提升和算数转换是否增加一些看法呢,最后也是,byebye

http://www.cnnetsun.cn/news/3004554.html

相关文章:

  • AI时代岗位价值再锚定:从防替代到重构职责的操作手册
  • Topit:让你的Mac窗口永远在最前方,工作效率提升300%的秘密武器
  • 锚定双碳热点,绿色智慧园区开启低碳运营新范式
  • ReAct Agent 完整实现:从零构建能查天气、算数学的智能助手
  • AlibabaProtect 服务彻底卸载指南
  • Midjourney V7实操指南:Personalization Profile与Draft Mode深度解析
  • 【经典面试】C++ Core Dump该怎么办?
  • Gemini 3.1 Pro工程实战指南:200万上下文与原生多模态如何落地技术工作流
  • 现代密码学实验四
  • AI回答采集任务调度与数据质量管理实践
  • 基于 EtherCAT + CiA402 的双机械臂10°周期运动流程解析
  • 如何3步实现智能屏幕翻译:终极跨语言沟通解决方案
  • WEF未来就业报告实操指南:从任务重构到6个月技能升级
  • 终极屏幕翻译工具:告别复制粘贴,实现真正的框选即译
  • 生产级稳定性压测,Instinct GPU 运行 vLLM 一周真实表现
  • Beyond GPT-4:AI系统级能力位移与工程落地指南
  • GraphQL安全漏洞深度解析:从注入攻击到DoS防护的7大核心风险
  • 微软 Generative AI for Beginners:11 万 Star 的 AI 入门课,到底教了什么
  • 质量管理工具-矩阵数据分析法
  • 5家国内主流企业级大模型运营治理平台实测排行
  • NSK滚珠丝杠SFT2810-2.5技术规格详解
  • 如何在3分钟内完成中国象棋AI智能识别配置:新手友好的完整教程
  • AUTOSAR 完整深度详解
  • OAuth2 登录与群 Webhook 开放接入
  • ADC 笔记 —— STM32 标准库实现
  • 人工智能专业术语详解(S)
  • 用友NC漏洞XVE-2024-13067:从SQL注入到RCE的完整复现与深度剖析
  • 从“只会点鼠标”到“爱上敲命令”:Linux基础入门 重定向
  • TIDAL Downloader Next Generation终极指南:轻松获取24-bit高解析度无损音乐
  • HS2-HF Patch:游戏模组生态系统的架构演进与技术实践