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

相关文章

Python3脚本实现Excel与TXT的智能转换

《Python3脚本实现Excel与TXT的智能转换》在数据处理的日常工作中,我们经常需要将Excel中的结构化数据转换为其他格式,本文将使用Python3实现Excel与TXT的智能转换,需要的可以... 目录场景应用:为什么需要这种转换技术解析:代码实现详解核心代码展示改进点说明实战演练:从Excel到

使用Go语言开发一个命令行文件管理工具

《使用Go语言开发一个命令行文件管理工具》这篇文章主要为大家详细介绍了如何使用Go语言开发一款命令行文件管理工具,支持批量重命名,删除,创建,移动文件,需要的小伙伴可以了解下... 目录一、工具功能一览二、核心代码解析1. 主程序结构2. 批量重命名3. 批量删除4. 创建文件/目录5. 批量移动三、如何安

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

Java数字转换工具类NumberUtil的使用

《Java数字转换工具类NumberUtil的使用》NumberUtil是一个功能强大的Java工具类,用于处理数字的各种操作,包括数值运算、格式化、随机数生成和数值判断,下面就来介绍一下Number... 目录一、NumberUtil类概述二、主要功能介绍1. 数值运算2. 格式化3. 数值判断4. 随机

C语言中自动与强制转换全解析

《C语言中自动与强制转换全解析》在编写C程序时,类型转换是确保数据正确性和一致性的关键环节,无论是隐式转换还是显式转换,都各有特点和应用场景,本文将详细探讨C语言中的类型转换机制,帮助您更好地理解并在... 目录类型转换的重要性自动类型转换(隐式转换)强制类型转换(显式转换)常见错误与注意事项总结与建议类型

Python实现视频转换为音频的方法详解

《Python实现视频转换为音频的方法详解》这篇文章主要为大家详细Python如何将视频转换为音频并将音频文件保存到特定文件夹下,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果5. 注意事项

使用Python实现图片和base64转换工具

《使用Python实现图片和base64转换工具》这篇文章主要为大家详细介绍了如何使用Python中的base64模块编写一个工具,可以实现图片和Base64编码之间的转换,感兴趣的小伙伴可以了解下... 简介使用python的base64模块来实现图片和Base64编码之间的转换。可以将图片转换为Bas

Go语言利用泛型封装常见的Map操作

《Go语言利用泛型封装常见的Map操作》Go语言在1.18版本中引入了泛型,这是Go语言发展的一个重要里程碑,它极大地增强了语言的表达能力和灵活性,本文将通过泛型实现封装常见的Map操作,感... 目录什么是泛型泛型解决了什么问题Go泛型基于泛型的常见Map操作代码合集总结什么是泛型泛型是一种编程范式,允

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤