目录

序言:

一.bool类型

(1)C语言中到底有没有bool类型?

(2)VS中的BOOL类型

二.浮点数与 0 比较

(1)浮点数的精度缺失

(2)浮点数判断相等解决方案

(3)判断浮点数是否为 0

最后:


序言:

C语言中有很多类型,但是bool我们至今也没有见过。那到底C语言中到底有没有bool类型呢?

我们之前聊过浮点数的在内存中的存储问题,由于浮点数在内存中比较特殊的存储结构,也造成了浮点数在判断相等的时候,有着比较特殊的比较方法。今天我们也就聊一聊这两个问题。

一.bool类型

(1)C语言中到底有没有bool类型?

c99之前,主要是c90标准是没有的,目前大部分书,都是认为没有的。因为书,一般都要落后于行业。
但是c99引入了_Bool类型(你没有看错,_Bool就是一个类型,不过在新增头文件stdbool.h中,被重新用宏写成了bool,为了保证C/C++兼容性)。

演示代码:

#include<stdio.h>
#include<stdbool.h>
int main()
{_Bool ret1 = false;_Bool ret2 = true;bool ret3 = false;bool ret4 = true;return 0;
}

这两种写法当然都是正确的,都能编译通过。只不过bool是_Bool宏定义。

那么我们就可以来看一看bool类型占用几个字节,

我们查看 true 和 false 底层也是用 0 和 1 宏定义的。

占用一个字节,理论上也就不难理解,表示真假一个bit就够了,不过这个问题还得取决于编译器,VS2013,VS2017,VS2019,VS2022,都认为是一个字节。

但是因为,目前编译器对C99特性的支持并不全面,所以我们在编码的时候,还是以C90的认识去编码就可以了,使用整形的方式表示真假,0表示假,非0表示真。

(2)VS中的BOOL类型

我们来看一段代码:

#include<stdio.h>
#include<stdbool.h>
#include<Windows.h>
int main()
{BOOL ret = true;printf("%d\n", sizeof(BOOL));return 0;
}

BOOL类型包含在我们的头文件 windows.h 里面。

我们发现,竟然也能编过。。。什么鬼??
这都是Microsoft自己搞的一套BOOL值。在vs中转到BOOL对应的头文件,翻到最上面,就能看到微软的版权信息。好了,该听谁的??微软?强烈不推荐,用微软的标准微软也不能给我们发offer,一个好的习惯是:一定要保证代码的跨平台性,微软定义的专属类型,其他平台不支持。为了保证代码跨平台性,以后如果有使用的话,还是选择使用C99标准。

二.浮点数与 0 比较

(1)浮点数的精度缺失

我们之前讲过浮点数的存储问题了,我们知道浮点数在往计算机的存储的时候都是二进制的存储方式,但是有一些浮点数并不像我们想的,是完整存储的,在十进制转化成为二进制,是有可能有精度损失的。注意这里的损失,不是一味的减少了,还有可能增多。浮点数本身存储的时候,在计算不尽的时候,会“四舍五入”或者其他策略。

#include<stdio.h>
#include<stdbool.h>
#include<Windows.h>
int main()
{double x = 3.6;printf("%.50f\n", x);system("pause");return 0;
}

看一段代码:

大家可以猜一下结果,结果一定会让你大吃一惊!!

#include <stdio.h>
int main()
{double x = 1.0;double y = 0.1;printf("%.50f\n", x - 0.9);printf("%.50f\n", y);if ((x - 0.9) == y) {printf("you can see me!\n");}else {printf("oops\n");}return 0;
}

运行结果:

所以使用 == 直接对浮点数经行比较是强烈不建议的。

(2)浮点数判断相等解决方案

那么两个浮点数该如何比较呢?应该进行范围精度比较。

//伪代码
if((x-y) > -精度 && (x-y) < 精度)
{//TODO
}
//伪代码-简洁版
if(fabs(x-y) < 精度)
{ //fabs是浮点数求绝对值,在头文件 math.h 里面。//TODO
}

精度:
自己设置?后面如果有需要,可以试试,通常是宏定义。
使用系统精度?暂时推荐

#include<float.h> //使用下面两个精度,需要包含该头文件
DBL_EPSILON //double 最小精度
FLT_EPSILON //float 最小精度

代码调整后:

这里的 DBL_EPSILON 和 FLT_EPSILON可以理解为微积分中的一个概念——无穷小量,他是改变一个数大小的最小值。那自然当我们需要判断两个数是否相等时,只要判断他们差的绝对值是否小于FLT_EPSILON或者DBL_EPSILON;

(3)判断浮点数是否为 0

只要判断是否小于最小精度

#include <stdio.h>
#include <math.h>  //必须包含math.h,要不然无法使用fabs
#include <float.h>  //必须包含,要不然无法使用系统精度
int main()
{double x = 0.000001;double y = 0.00000000000000000000000000000001;if (fabs(x) < DBL_EPSILON){printf("you can see me!\n");}if(fabs(y)<DBL_EPSILON){printf("bye\n");}return 0;
}

运行结果:

x > -DBL_EPSILON && x < DBL_EPSILON: 为何不是>= && <= 呢?个人看法:XXX_EPSILON是最小误差,是:XXX_EPSILON+n不等于n的最小的正数。XXX_EPSILON+n不等于n的最小的正数: 有很多数字+n都可以不等于n,但是XXX_EPSILON是最小的,but,XXX_EPSILON依旧是引起不等的一员。换句话说:fabs(x) <= DBL_EPSILON(确认x是否是0的逻辑),如果=,就说明x本身,已经能够引起其他和他+-的数据本身的变化了,这个不符合0的概念。

最后:

把意念深潜得下,何理不可得,把志气奋发起,何事不可做。击败焦虑的最好的办法就是学习,加油,诸君,山顶见!!

C语言深度剖析——bool类型,浮点数相等比较。相关推荐

  1. C语言深度剖析笔记1

    关键字的秘密 数据类型 什么是数据类型? 数据类型可以理解为固定内存大小的别名; 数据类型是创建变量的模子(花形的,圆形的,星形的等等); char 1byte short 2byte int 4by ...

  2. C语言深度剖析笔记2

    接上半部分 C语言深度剖析笔记1 https://blog.csdn.net/halazi100/article/details/125844487 C语言深度剖析笔记1 指针 变量回顾 既然程序中的 ...

  3. c语言深度剖析百度云,《C语言深度剖析》笔记

    <C语言深度剖析>笔记 1.在c语言中,凡不加返回值类型限定的函数,就会被编译器作为返 回整形处理. 2.register 变量必须是一个单个的值,并且其长度应小于或等于整型 的长度.而且 ...

  4. 国嵌c语言深度,国嵌C语言深度剖析班(第一期)-国嵌

    国嵌C语言深度剖析班(第一期)共20个课程,包含源码及教程,主要讲了基本数据类型分析.auto,register,static分析.if,switch,do,while,for分析等,本教程提供1-5 ...

  5. [学习笔记]C语言深度剖析

    近期正在看<C语言深度剖析>,里面有一个讲解自加运算符(++),有一程序如下: void main() {int i;for(i=0, printf("First i = %d\ ...

  6. c语言里有bool变量,C语言中有没有bool类型

    以下是引用lzxm160在2007-11-9 12:35:05的发言: C语言中有没有bool类型 要是没有,函数要返回 bool类型怎么办,有int代替么 完全没有必要使用 bool,int 绝对可 ...

  7. C语言——深度剖析数据在内存中的存储

    大家好!我是保护小周ღ,本期为大家带来的是深度剖析数据在内存中的存储,不知道,大家学了这么久C语言,有没有想过一个问题,我们在程序设计中的数据是怎么在计算机中存储的?我们都知道 一个整型数据 int ...

  8. C语言—深度剖析数据在内存中的存储

    深度剖析数据在内存中的存储 数据类型介绍 类型的基本归类 整形在内存中的存储 大小端介绍 整形在内存中的存储的相关练习 浮点型在内存中的存储 浮点型在内存中的存储相关介绍 数据类型介绍 内置类型(C语 ...

  9. 【C语言深度剖析】关键字(全)

    文章目录 一.存储类型关键字 前言 补充1:内存 思考: 补充2:变量与内存的关系 补充3:变量的分类 补充4:存储类 补充5:删除数据是怎么删除的? 1.auto 2.register 3.stat ...

最新文章

  1. 我觉得要技术者上升到整体去考虑会好点
  2. 软件工程复习提纲——第七章
  3. 继续推荐几款VisualStudio的插件
  4. php 不同数据库的调用方法,php连接不同数据库的几种方法
  5. 【二分法】计蒜客:对数方程
  6. AntiModerate – 渐进式图片加载的 JavaScript 库
  7. 啊哈C语言第四章 第九节
  8. ISO-国际标准化组织
  9. 路径规划基本介绍(一)
  10. GDI简单绘图(二)- 绘制验证码
  11. 如何通过视频转换器将qsv格式转换成mp4格式
  12. 计算机专业有关游戏设计的论文,有关游戏美术设计论文
  13. 吉林省专升本历年真题高频词汇
  14. UFS系列六:UFS设备初始化和启动
  15. python ttk style,如何改变ttk.progressBar颜色在python
  16. 一站式文本标注工具doccano(你值得拥有)
  17. 大数据三篇论文—The Google File System中文版
  18. 元宇宙场景技术实践|实现“虚拟人”自由
  19. 数值分析matlab最小二乘法,数值分析及其MATLAB实验(第2版)
  20. 企业微信发送图片失败

热门文章

  1. 利用C语言打印9*9乘法表
  2. 加载本地gradle配置
  3. ROS之map_server 源码解析
  4. Android开发实例-高校录取分数线应用(一)
  5. 最大公约数最小公倍数 辗转相除法 辗转相减法(更相减损法) 穷举法
  6. 路遥马急的人间 谁又记得谁几年呢
  7. 2022CCCC天梯赛(个人代码)
  8. Jupyter安装过程遇到问题汇总
  9. 二维动画制作相对于传统宣传的优势
  10. 使用递归方法进行逆序输出字符串