目录
序言:
一.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)浮点数的精度缺失
我们之前讲过浮点数的存储问题了,我们知道浮点数在往计算机的存储的时候都是二进制的存储方式,但是有一些浮点数并不像我们想的,是完整存储的,在十进制转化成为二进制,是有可能有精度损失的。注意这里的损失,不是一