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

相关文章

C语言进阶(预处理命令详解)

《C语言进阶(预处理命令详解)》文章讲解了宏定义规范、头文件包含方式及条件编译应用,强调带参宏需加括号避免计算错误,头文件应声明函数原型以便主函数调用,条件编译通过宏定义控制代码编译,适用于测试与模块... 目录1.宏定义1.1不带参宏1.2带参宏2.头文件的包含2.1头文件中的内容2.2工程结构3.条件编

Go语言并发之通知退出机制的实现

《Go语言并发之通知退出机制的实现》本文主要介绍了Go语言并发之通知退出机制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、通知退出机制1.1 进程/main函数退出1.2 通过channel退出1.3 通过cont

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

Kotlin Map映射转换问题小结

《KotlinMap映射转换问题小结》文章介绍了Kotlin集合转换的多种方法,包括map(一对一转换)、mapIndexed(带索引)、mapNotNull(过滤null)、mapKeys/map... 目录Kotlin 集合转换:map、mapIndexed、mapNotNull、mapKeys、map

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

PowerShell中15个提升运维效率关键命令实战指南

《PowerShell中15个提升运维效率关键命令实战指南》作为网络安全专业人员的必备技能,PowerShell在系统管理、日志分析、威胁检测和自动化响应方面展现出强大能力,下面我们就来看看15个提升... 目录一、PowerShell在网络安全中的战略价值二、网络安全关键场景命令实战1. 系统安全基线核查

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁