【C语言】深入理解C语言中的数学运算和类型转换

news2024/12/26 12:52:48

文章目录

  • 引言
  • 取负运算的奥秘
    • 源码探索
    • 分析与解读
  • 浮点数运算的精细差异
    • 源码分析
  • 精度损失与隐式类型转换
  • 精度和除零运算探究
    • float类型和double类型的精度各是多少(即十进制有效位的位数)?
    • 在你的机器上,“负数开方”是如何处理的(如“-8.0/0”、“sqrt(-4.0)”的运算结果)?
    • 在你的机器上,整数除0和浮点数除0的运行结果各是什么?为什么会有不同的运行结果?,并将“-6.0/0”和“-6/0”的运行结果进行比较。
  • 结语

引言

在编程中,理解各种数据类型的运算规则是至关重要的。本文将通过几个示例,深入探讨C语言中整数和浮点数的取负运算、浮点数的精度问题以及除零运算的处理机制。

取负运算的奥秘

源码探索

分析以下简单的C程序:

int main()
{
	int x = -2147483648;
	int y = 3;
	float f = 1.5;
	printf("%d\n", -x > y);
	printf("%f\n", -f);
	return 0;
}

在这里插入图片描述
在这里插入图片描述

分析与解读

  • 当我们对整数 x 取负时,由于它已经是32位整数的最小可能值,其补码表示无法再表示一个更大的正数,因此 -x 仍然等于 -2147483648。这导致 -x > y 的判断为,因此第一个 printf 输出为0

  • 另一方面,浮点数 f 的取负运算简单明了,结果自然就是 -1.5。因此,第二个 printf 输出 -1.500000

浮点数运算的精细差异

源码分析

接下来,我们看一个涉及浮点数运算的程序:

#include <stdio.h>
int main()
{
	float x = -1.5e38;
	float y = 1.5e38;
	float z = 1.0;
	int i = (x + y) + z;
	int j = x + (y + z);
	printf("%d\n", i == j);
	return 0;
}

在这里插入图片描述
在这里插入图片描述

精度损失与隐式类型转换

  • 在上述代码中,我们试图通过不同的运算顺序来比较结果是否相同。然而,由于浮点数的精度限制和整数类型的截断行为ij 得到的结果很可能不同,因此输出为0(false)。这个例子清晰地展示了浮点数运算中的精度损失和隐式类型转换可能导致的意外结果。

  • 在表达式 (x + y) + z 中,xy 是浮点数,而 z 是浮点数转换为整数后的结果。根据C语言的运算规则,当一个浮点数和一个整数进行运算时,整数会被自动转换为浮点数。因此,(x + y) 的结果是一个浮点数,再加上 z 后得到的结果也是一个浮点数。然而,由于 i 是整型变量,这个浮点数会被截断成整数并赋值给 i
    类似地,在表达式 x + (y + z) 中,yz 是浮点数,而 x 是一个负浮点数。同样根据C语言的运算规则,负浮点数和浮点数进行运算时,会进行隐式类型转换,使结果仍为浮点数。因此,(y + z) 的结果是一个浮点数,再加上 x 后得到的结果也是一个浮点数。然而,由于 j 是整型变量,这个浮点数会被截断成整数并赋值给 j

  • 如果想要避免隐式类型转换,可以显式地进行类型转换操作,将浮点数转换为整型。例如,可以使用 int(i)int(j) 来将浮点数转换为整型。这样可以确保进行精确的整数比较

精度和除零运算探究

float类型和double类型的精度各是多少(即十进制有效位的位数)?

#include <stdio.h>
#include <float.h>

int main() {
    printf("float类型的十进制有效位数: %d\n", FLT_DIG);
    printf("double类型的十进制有效位数: %d\n", DBL_DIG);

    return 0;
}

在这里插入图片描述
在C语言中,可以使用float.h头文件中定义的常量来获取floatdouble类型的精度信息。具体而言,FLT_DIG和DBL_DIG分别表示floatdouble类型的十进制有效位数。
这段代码将打印出floatdouble类型的十进制有效位数。在大多数系统上,你会看到类似以下的输出:
float类型的十进制有效位数: 6
double类型的十进制有效位数: 15
这样就直接获取了floatdouble类型的十进制有效位数,而无需手动计算。

在你的机器上,“负数开方”是如何处理的(如“-8.0/0”、“sqrt(-4.0)”的运算结果)?

在这里插入图片描述

  • 当进行表达式 -8.0/0 进行计算时,结果会被认为是负无穷大(-∞)。这是因为除以零是一个非法的操作,C语言规定将其视为一种特殊情况,结果被定义为负无穷大或正无穷大。
    在这里插入图片描述
  • 当进行表达式 sqrt(-4.0) 进行计算时,结果会被认为是一个特殊值NaN(Not a Number),表示无效的操作。负数的平方根是一个虚数,在实数域中没有定义。

在你的机器上,整数除0和浮点数除0的运行结果各是什么?为什么会有不同的运行结果?,并将“-6.0/0”和“-6/0”的运行结果进行比较。

在这里插入图片描述

在VS中,错误C2124表示发生了除以零或求模运算中的被零除的情况。这个错误通常出现在编译时,是因为代码中存在了除以零或对零求模的操作,这是一种不合法的操作。
这个错误会阻止程序的继续编译,因为除以零是一种未定义的行为,违反了数学和计算机的基本规则。
要解决这个错误,你需要检查代码中是否存在除以零或对零求模的操作,并确保避免这种情况的发生。可以通过添加适当的条件判断来避免除以零或对零求模,在进行除法或求模运算之前检查除数是否为零。
例如,可以使用条件语句来避免除以零的情况:

if(b != 0) {
    result = a / b; // 在除数不为零时执行除法运算
} 
else{
    // 处理除数为零的情况,例如输出错误信息或采取其他操作
  	printf("除数不能为零\n");
}

结语

通过本文的分析,我们了解了C语言中数学运算和类型转换的一些关键细节。从取负运算到浮点数的精度,再到除零的处理,每个概念都对编写可靠和高效的代码至关重要。希望这篇文章能帮助你在未来的编程实践中避免一些常见的陷阱。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1284065.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pbootcms建站

pbootcms建站 一、下载pbootcms二、安装1、进入宝塔面在网站栏&#xff0c;新建站点&#xff0c;将该址里面文件全部清再将下载的pbootcms上传至该地址。 三、修改关联数据库1、在根目录下/config打开database.php照如下修改这里我使用mysqli数据库。修改并使用自已创建的数据库…

206 反转链表

解题思路可以有两种方法&#xff1a;递归 or 迭代。 \qquad 迭代&#xff1a;通过使用for循环遍历&#xff0c;完成目标。方法直观&#xff0c;容易理解。 \qquad 递归&#xff1a;通过函数调用其自身&#xff0c;完成目标。递归最复杂、最重要的部分就是递归函数的构建&#…

flask web开发学习之初识flask(三)

文章目录 一、flask扩展二、项目配置1. 直接配置2. 使用配置文件3. 使用环境变量4. 实例文件夹 三、flask命令四、模版和静态文件五、flask和mvc架构 一、flask扩展 flask扩展是指那些为Flask框架提供额外功能和特性的库。这些扩展通常遵循Flask的设计原则&#xff0c;易于集成…

电脑发生0x80070002错误,0x80070002错误代码怎么解决

电脑发生0x80070002错误代码是一个常见的问题&#xff0c;它通常与Windows更新或系统文件损坏有关。当你的电脑出现这个错误代码时&#xff0c;在使用电脑时可能会受到影响&#xff0c;因为这可能意味着系统无法正常更新或运行。几天的这篇文章将和大家聊聊0x80070002错误代码怎…

学习UnitTest框架,轻松打造无懈可击的代码!

一、什么是UnitTest&#xff1f; 1、介绍 unittest是Python自带的一个单元测试框架&#xff0c;它可以做单元测试&#xff0c;也能用于编写和运行重复的测试工作。 它给自动化测试用例开发和执行提供了丰富的断言方法&#xff0c;判断测试用例是否通过&#xff0c;并最终生成…

Shell数组函数:数组(一)

一、数组简介&#xff1a; 变量&#xff1a;用一个固定的字符串&#xff0c;代替一个不固定字符串。数组&#xff1a;用一个固定的字符串&#xff0c;代替多个不固定字符串。 二、类型 普通数组&#xff1a;只能使用整数作为数组索引关联数组&#xff1a;可以使用字符串作为…

Web前端 ---- 【vue】vue 组件传值(props、全局事件总线、消息的订阅与发布)

目录 前言 父子组件 父传子 子传父 全局事件总线 什么叫全局事件总线 如何创建全局事件总线 如何在组件上获取到这个全局vc对象 最常用的创建全局事件总线 兄弟组件 消息订阅与发布 安装 使用 爷孙组件 前言 在上篇文章我们介绍了父子组件之间的传值通信&#xff…

鸿蒙4.0开发笔记之ArkTS装饰器语法基础之发布者订阅者模式@Provide和@Consume(十三)

1、定义 在鸿蒙系统的官方语言ArkTS中&#xff0c;有一套类似于发布者和订阅的模式&#xff0c;使用Provide、Consume两个装饰器来实现。 Provide、Consume&#xff1a;Provide/Consume装饰的变量用于跨组件层级&#xff08;多层组件&#xff09;同步状态变量&#xff0c;可以…

【Altium designer 20】

Altium designer 20 1. Altium designer 201.1 原理图库1.1.1 上划岗 在字母前面加\在加字母1.1.2 自定义快捷键1.1.3 对齐1.1.4 在原有的电路图中使用封装1.1.5 利用excel创建IC类元件库1.1.6 现有原理图库分类以及调用1.1.7 现有原理图库中自动生成原理图库 1.2 绘制原理图1.…

PHP项目启动记录

PHP项目启动记录 1. 项目整体目录2. bash_profile3. nginx的conf配置4. vim /etc/hosts5. php -v6.修改nginx后重新加载nginx7. npm run watch-app --moduleattendance --platformmobile8. vim ~/.zshrc 1. 项目整体目录 2. bash_profile ~/.bash_profile是Mac系统中的一个配置…

MySQL笔记-第06章_多表查询

视频链接&#xff1a;【MySQL数据库入门到大牛&#xff0c;mysql安装到优化&#xff0c;百科全书级&#xff0c;全网天花板】 文章目录 第06章_多表查询1. 一个案例引发的多表连接1.1 案例说明1.2 笛卡尔积&#xff08;或交叉连接&#xff09;的理解1.3 案例分析与问题解决 2. …

B026-MySQL基础

目录 数据库概述数据库概念数据库的由来和发展常见的关系型数据库服务器&#xff08;DBMS&#xff09;SQL概述表的概念 数据库的安装与配置安装启动和连接MySQL启动MySQL服务连接MySQL MySQL图形化管理软件-Navicat数据库安装失败解决方案 MySQL数据库操作数据库操作和存储引擎…

4K-Resolution Photo Exposure Correction at 125 FPS with ~8K Parameters

MSLTNet开源 | 4K分辨率125FPS8K的参数量&#xff0c;怎养才可以拒绝这样的模型呢&#xff1f; 错误的曝光照片的校正已经被广泛使用深度卷积神经网络或Transformer进行广泛修正。尽管这些方法具有令人鼓舞的表现&#xff0c;但它们通常在高分辨率照片上具有大量的参数数量和沉…

Linux系统下Nginx的安装步骤

目录 Nginx简介Nginx的作用Nginx的安装方法方法一方法二方法三 本文主要介绍在Linux系统下&#xff0c;三种常见Nginx安装方法。 Nginx简介 Nginx是一个高性能的HTTP和反向代理服务器&#xff0c;也可以作为邮件代理服务器和通用的TCP/UDP代理服务器。它最初由Igor Sysoev创建…

JVM之垃圾回收与算法(四)

垃圾回收与算法 1.如何确定垃圾 1.1. 引用计数法 在 Java 中&#xff0c;引用和对象是有关联的。如果要操作对象则必须用引用进行。因此&#xff0c;很显然一个简单的办法是通过引用计数来判断一个对象是否可以回收。简单说&#xff0c;即一个对象如果没有任何与之关联的引用…

GPIO的使用--点亮外接小灯泡--开关控制

目录 一、确定引脚接线模式 接线时注意以下几点&#xff1a; 二、外接小灯泡引脚连接(以F12引脚为例) 1.正极接GPIOF3.3v电压引脚、负极接F12 2.正极接GPIOF3.3v电压引脚、负极接F12 三、问题检查 一、确定引脚接线模式 小灯泡有两级&#xff1a;正极、负极&#xff0c;…

春秋云镜:CVE-2022-28512

靶标介绍&#xff1a; Fantastic Blog (CMS)是一个绝对出色的博客/文章网络内容管理系统。它使您可以轻松地管理您的网站或博客&#xff0c;它为您提供了广泛的功能来定制您的博客以满足您的需求。它具有强大的功能&#xff0c;您无需接触任何代码即可启动并运行您的博客。 该…

决策树 算法原理

决策树 算法原理 决策树的原理 决策树: 从训练数据中学习得出一个树状结构的模型 决策树属于判别模型 决策树是一种树状结构&#xff0c;通过做出一系列决策 (选择) 来对数据进行划分&#xff0c;这类似于针对一系列问题进行选择。 决策树的决策过程就是从根节点开始&#…

JDK安装太麻烦?一篇文章搞定

JDK是 Java 语言的软件开发工具包&#xff0c;主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心&#xff0c;它包含了JAVA的运行环境&#xff08;JVMJava系统类库&#xff09;和JAVA工具。 JDK包含的基本组件包括&#xff1a; javac – 编译器&#xf…

资深老鸟整理,高级测试工程师应具备的能力...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、业务熟悉 熟悉…