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

[C]整形提升(转载)

整形提升

什么是整形提升?

在K&R和C89的早期实现中,基于short和char的算术运算陷入两难的困境,因为可能会产生两种不同的结果。因此,在C99中很明

确地定义了整型提升的规则. 如果int能够表示原始类型中的所有数值,那么这个数值就被转成int型,否则,它被转成unsigned int

型。这种规则被称为整型提 升。所有其它类型都不会被整型提升改变。

整型提升的概念容易与普通算术类型转换产生混淆。这两者的区别之一在于后者是在操作数之间类型不一致的情况下发生,最终将

操 作数转换为同一类型。而在算术运算这种情景下,即使操作数具有相同的类型,仍有可能发生整型提升。

举个例子,我们来感受一下整形提升:

#include<stdio.h>  
 int main()  
 {  
    char a = -128;  
    printf("%u\n",a);  
    return 0;  
}

结果是4294967168

这个就很奇怪了,为什么会输出一个这么大的数字? char存储不应该就是应该只有8位,最大表示为127.

我们已经知道了-128的补码序列,现在把它提出来(1000 0000 ),但是你是希望计算 机以%u的形式打印出来,所以你要对-128的补码形式进行扩展

(整形提升),把它扩展成32位,由于扩展是根据你自身的符号位扩 展,所以你往 它的前面加上24个1。然后%u他只是拿到你的序列将它打印出来,所以

他就打印出来我们 刚刚扩展出来的2进制序列, 也就是上面的 值。

-128 整形提升后补码形式:

1111 1111 1111 1111 1111 1111 1000 0000

还有这里的%u,我们都应该知道数据在内存中是以补码形式存储的,现在%u输出也就是认为你就是无符号数,所以在%u的角度来

讲,它直接从你的内存中拿出来的就是原码,直接输出内存中拿出来的数据.

这里记住了哈,当你看到 下面这些类型 %d %u 或者他们进行算术运算时,就会发生整形提升:

signed char: -127 -> 127
unsigned char: 0 -> 255
signed short: -32767 -> 32767
unsigned short: 0 -> 65535
signed int: -2147483647 -> 2147483647

例如:

char a, b, c;

c = a + b;

在上述过程中,尽管两个运算符"+"和"="的操作数全为char型,但在中间计算过程中存在着整型提升:对于表达式a+b ,a、b都是char型,因此被提升至int型后,执行“+”运算,计算结果(int型)再赋值给c(char型),又执行了隐式的类型转换换回char.

那么问题来了,为什么要整形提升呢?

通常情况下,在对int类型的数值作运算时,CPU的运算速度是最快的。在x86上,32位算术运算的速度比16位算术运算的速度快一倍。C语言是一个注重

效率的语言,所以它会作整型提升,使得程序的运行速度尽可能地快。因此,你必须记住整型提升规则,以免发生一些整型溢出的问题。

下面我们再看看几个例子吧:

printf(“sizeof(‘A’) = %d”, sizeof(‘A’));

这个答案为4

具体原因: 字符‘A’是int型,不需整型提升,int型占4字节

char a, b;
printf(“sizeof(a+b)=%d”, sizeof(a+b));

这个答案为4

具体原因:a+b是一个算术表达式,a、b均整型提升(int型),所以占4个字节。

char a, b, c;
printf(“sizeof(c=a+b)=%d”, sizeof(c=a+b));

这个答案是1

原因:表达式c=a+b中,a和b是算术运算,因此整型提升(int型),计算结果(int型)再赋值给c(char型),又执行了隐式的类型转换,所以最终占1字节。

转载自:http://www.codercto.com/a/Y3RvNDc1NGN0bw==.html

转载于:https://www.cnblogs.com/22Kon/p/7786782.html

相关文章:

  • 软考高级(四)
  • 大数据等最核心的关键技术:32个算法
  • 处理数据对象的实用函数
  • es6笔记干货
  • 小提琴图
  • gitlab-ci配置详解(一)
  • 解决firefox疯狂读硬盘的问题
  • 动态类型序列化
  • 【java】java学习之路-01-Linux基础(一)
  • NullAway:Android上的NullPointerExceptions的开源工具
  • ASP.NET MVC Model元数据(五)
  • Android 解决ListView 和 ScrollView 共存冲突的问题
  • [Web开发] Web 2.0 网站估价工具
  • c#中的反射机制
  • 利用QRmaker制作二维码
  • 【译】JS基础算法脚本:字符串结尾
  • 03Go 类型总结
  • 30天自制操作系统-2
  • 345-反转字符串中的元音字母
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • crontab执行失败的多种原因
  • github指令
  • JS基础之数据类型、对象、原型、原型链、继承
  • overflow: hidden IE7无效
  • Python语法速览与机器学习开发环境搭建
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 大数据与云计算学习:数据分析(二)
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 分布式任务队列Celery
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 前端技术周刊 2019-01-14:客户端存储
  • 用Visual Studio开发以太坊智能合约
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 智能合约Solidity教程-事件和日志(一)
  • 阿里云重庆大学大数据训练营落地分享
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • $.each()与$(selector).each()
  • (3)llvm ir转换过程
  • (7)STL算法之交换赋值
  • (八)Spring源码解析:Spring MVC
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (七)理解angular中的module和injector,即依赖注入
  • (算法)求1到1亿间的质数或素数
  • (转)visual stdio 书签功能介绍
  • ******之网络***——物理***
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .NET NPOI导出Excel详解
  • .net web项目 调用webService
  • .net分布式压力测试工具(Beetle.DT)
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思
  • [ vulhub漏洞复现篇 ] Apache Flink目录遍历(CVE-2020-17519)
  • [ 手记 ] 关于tomcat开机启动设置问题