C语言之整形提升和算术转换

2024-05-05 23:44

本文主要是介绍C语言之整形提升和算术转换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


目录

前言

一、整形提升

二、算术转换

总结


前言

        本文主要介绍C语言中的整形提升和算术转换的概念和意义,以及例题帮助理解,了解之后,我们就能知道在C语言中,字符型变量如何计算以及如果变量的类型、字节大小不一致的情况下,计算机是如何计算出结果的。


一、整形提升

1.概念

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


2.整形提升的意义

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

        因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。 通用CPU(general-purposeCPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。

        所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算


3.整形提升的规则

如何进行整体提升呢?

  1. 有符号整数提升是按照变量的数据类型的符号位来提升的
  2. 无符号整数提升,高位补0

整形提升只会发生在字符型或短整型变量的计算中


4.举例

(注:涉及到原码反码补码,不了解的可以参考我主页的位操作符文章)

了解了整形提升和提升规则后,我们看下面代码:

我们可以先猜一下最终结果

我们画图分析:(注:一个字符占一个字节,一个整形占4个字节,一个字节为8个比特位)

通过分析结果应该为-106,我们运行验证一下:

结果完全正确


6.小结

        以上就是关于整形提升的全部内容,我们一定要注意的是整形提升只发生在字符型或短整型变量的计算中,这种计算中的变化我们一般察觉不到,但确实是真真实实发生了的,另外就是注意整形提升的规则。


二、算术转换

        那么字符型或短整型有整形提升,那像整形与长整型这样的变量计算时会发生变化吗,答案是肯定的,这种变化就涉及到了算术转换

1.概念     

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

下面的层次体系称为寻常算术转换:(从下往上转换)

也就是说,遇到上面不同类型的变量计算,计算过程中会把层次低的变量转换为层次高的变量类型


2.举例

我们看下面代码:

#include <stdio.h>

int i;

int main()
{
    i--;
    if (i > sizeof(i))
    {
        printf(">\n");
    }
    else
    {
        printf("<\n");
    }

    return 0;
}

你觉得最终会打印出什么?

我们先看结果:

结果为大于号,为什么?

我们来分析一下:

  1. 首先第一个雷点为,全局变量 i 没有初始化,在C语言中,全局变量没有初始化会默认值为0而不是随机值
  2. 随后 i--,i 的值变为-1
  3. 第二个雷点:sizeof返回值为一个无符号整形4,也就是unsigned int ,而 i 为一个 int 类型,因此在它们的比较运算中会发生算术转换
  4. 因为 i 等于-1,它的补码为11111111111111111111111111111111,而将它转换为无符号整形,它将会被编译器解释为一个非常大的数字,注意:此处的转换不是改变符号位,而是直接解释为一个无符号整形,也就是正数,而正数的原反补码相同。32个1的二进制数将是32个比特位能表达的最大数字了,因此这个数值非常大,所以此处会打印大于号>


总结

        以上就是本文关于整形提升和算数转换的全部内容了,希望对大家有所帮助,感谢支持

这篇关于C语言之整形提升和算术转换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/962981

相关文章

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

Go语言中json操作的实现

《Go语言中json操作的实现》本文主要介绍了Go语言中的json操作的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 一、jsOChina编程N 与 Go 类型对应关系️ 二、基本操作:编码与解码 三、结构体标签(Struc

Java轻松实现PDF转换为PDF/A的示例代码

《Java轻松实现PDF转换为PDF/A的示例代码》本文将深入探讨Java环境下,如何利用专业工具将PDF转换为PDF/A格式,为数字文档的永续保存提供可靠方案,文中的示例代码讲解详细,感兴趣的小伙伴... 目录为什么需要将PDF转换为PDF/A使用Spire.PDF for Java进行转换前的准备通过

python语言中的常用容器(集合)示例详解

《python语言中的常用容器(集合)示例详解》Python集合是一种无序且不重复的数据容器,它可以存储任意类型的对象,包括数字、字符串、元组等,下面:本文主要介绍python语言中常用容器(集合... 目录1.核心内置容器1. 列表2. 元组3. 集合4. 冻结集合5. 字典2.collections模块

基于Go语言开发一个 IP 归属地查询接口工具

《基于Go语言开发一个IP归属地查询接口工具》在日常开发中,IP地址归属地查询是一个常见需求,本文将带大家使用Go语言快速开发一个IP归属地查询接口服务,有需要的小伙伴可以了解下... 目录功能目标技术栈项目结构核心代码(main.go)使用方法扩展功能总结在日常开发中,IP 地址归属地查询是一个常见需求:

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

Python中Json和其他类型相互转换的实现示例

《Python中Json和其他类型相互转换的实现示例》本文介绍了在Python中使用json模块实现json数据与dict、object之间的高效转换,包括loads(),load(),dumps()... 项目中经常会用到json格式转为object对象、dict字典格式等。在此做个记录,方便后续用到该方

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam