DSP

bool和BOOL类型知识集合

2019-07-13 20:02发布

知识点一、C语言中有bool类型吗?    转自http://blog.csdn.net/liuqiqi677/article/details/6703615      之前一直都没有注意到,最近在用C语言写DSP算法时,偶然间发现我函数中定义的bool类型的变量在VC6.0(我主要用它来检查一下语法错误)中编译居然报错了,说是bool类型没有定义。用了这么久的C和C++了,一直觉得bool这种基本类型,应该是C语言内置的类型,怎么会没有定义呢?事实证明,我的想法完全错误了。       有了网络,一切问题都变得那么容易了,我很容易地搜到了相关的解答。       C语言里面是没有bool(布尔)类型的,C++里面才有,这就是说,在C++里面使用bool类型是没有问题的。bool类型有只有两个值:true =1 、false=0。       但是,C99标准里面,又定义了bool类型变量。这时,只要引入头文件 ,就能在C语言里面正常使用bool类型。这点我在Fedora9下验证过了,它自带的编译器是 gcc 4.3.0,符合C99标准。但是在VC6.0中,会报找不到头文件 stdbool.h 的错误,看来VC6.0确实比较老了。       所以,为了兼容各种编译器,还是自己定义吧。^_^             #define bool char
            #define ture 1
            #define false 0  C99标准定义了一个新的关键字_Bool,提供了布尔类型。以前,C程序员总是使用自己的方法定义布尔类型。         0表示false,非0表示true。         可能使用char类型表示一个布尔类型,也可能使用int类型表示一个布尔类型。          很多函数库都定义了自己的布尔类型和相应的宏,枚举,typedef。          现在C99把C语言原生的布尔类型带来了。 #include  这个头文件定义了bool,true,false等宏。 #ifndef__cplusplus 如果不是C++,是纯C,那么,定义宏bool相当于_Bool类型。 #definebool _Bool #definetrue 1 #definefalse 0   #else/* __cplusplus */ 如果是C++,那么定义_Bool类型为bool类型。 /*Supporting in C++ is a GCC extension. */ #define_Bool bool #definebool bool #definefalse false #definetrue true #endif/* __cplusplus */ /*Signal that all the definitions are present. */ #define__bool_true_false_are_defined 1 看看上面这个宏是否==1,如果是,表示上面这些定义可用。 C2008草案中说:      Anobject declared as type _Boolis large enough to store the values 0 and1.         也就是说,只规定了_Bool类型的大小是至少能够存放0和1这两个值。并没有规定具体的大小。这交给编译器自由发挥了。 我用gcc做了一下测试: printf("sizeof(bool):%d ",sizeof(bool)); printf("sizeof(char):%d ",sizeof(char)); printf("sizeof(int):%d ",sizeof(int)); printf("sizeof(long):%d ",sizeof(long));   --sizeof(bool):1 --sizeof(char):1 --sizeof(int):4 --sizeof(long):8 看来gcc是用char来实现_Bool类型的。   看看给_Bool类型赋值会怎样: boolboolean=-11212112; printf("boolean:%d ",boolean); --boolean:1        看来,gcc编译器对待_Bool类型有自己的转换处理。如果是0赋值给_Bool类型,那么就赋值0。如果是任意其他数据,那么会赋值为1!(只是不知道其他编译器是否如此处理,C2008标准草案没有细说这个部分)        以前一直用!逻辑非运算符: if(!flag){ }      来表示0和非0。现在_Bool类型就只有0和1这两个值!   知识点2、objective-c中的BOOL类型 1.objective-c中的 BOOL类型 实际上是一种带符号的字符类型(signed char)的定义(typedef),它使用8位存储空间。YES定义1,NO定义为0。 objective-c并不将BOOL类型作为仅能保存YES或NO的真正布尔类型来处理。编译器将BOOL认做一个8位二进制数,YES或NO只是一种约定。 如果不小心将一个长于1字节的整型值(例如short,int值)赋给一个BOOL变量,那么只有低位字节会用作BOOL值。假设该低位字节刚好为0(例如8960,写成16进制为0x2300), BOOL值将会是0,即NO值。   FALSE/TRUE与false/true的区别 1.FALSE/TRUE与false/true的区别: false/true是标准C++语言里新增的关键字,而FALSE/TRUE是通过#define,这要用途 是解决程序在C与C++中环境的差异,以下是FALSE/TRUE在windef.h的定义: #ifndef FALSE #define FALSE 0 #endif #ifndef TRUE #define TRUE 1 #endif 也就是说FALSE/TRUE是int类型,而false/true是bool类型;所以两者不一样的,只不过 我们在使用中没有这种感觉,因为C++会帮你做隐式转换。 2.bool的大小与BOOL的区别: bool在C++里是占用1字节,而BOOL是int类型,int类型的大小是视具体环境而定的;所以 来说:false/true只占用1个字节,而TRUE/FALSE视具体环境而言,以下是BOOL在windef .h中的定义:typedef int BOOL; 3.NULL与0的区别: 还是让我们看一下windef.h中NULL的定义: #ifndef NULL #ifdef __cplusplus//这个是指示是用C++来编译程序 #define NULL 0 #else #define NULL ((void *)0) #endif #endif 所以说:它们没有区别,只不过在C里面会做一个强制类型转换。 知识点三、bool和BOOL区别 一、 
1、类型不同 
BOOL为int型 
bool为布尔型 
2、长度不同 
bool只有一个字节 
BOOL长度视实际环境来定,一般可认为是4个字节 
3、取值不同 
bool取值false和true,是0和1的区别 
BOOL取值FALSE和TRUE,是0和非0的区别 
二: 
bool是标准C++数据类型,可取值true和false。单独占一个字节, 
如果数个bool对象列在一起,可能会各占一个bit,这取决于编译器。 

BOOL是微软定义的typedef int BOOL。与bool不同,它是一个三值逻辑, 
TRUE/FALSE/ERROR,返回值为>0的整数为TRUE,0为FALSE,-1为ERROR。 
Win32 API中很多返回值为BOOL的函数都是三值逻辑。比如GetMessage(). 
三: 
大BOOL和小bool之间的区别: 
1、类型不同 
BOOL为int型 
bool为布尔型 
2、长度不同 
bool只有一个字节 
BOOL长度视实际环境来定,一般可认为是4个字节 
3、取值不同 
bool取值false和true,是0和1的区别 
BOOL取值FALSE和TRUE,是0和非0的区别 
4、例子 
bool x=3;  //告警 
bool x=1;  //正确 
BOOL x=3;  //正确 
BOOL x=3.3;  //告警 
注:windows为了兼容问题定义的基础变量。 
typedef unsigned long        DWORD; 
typedef int                  BOOL; 
typedef unsigned char        BYTE; 
typedef unsigned short      WORD; 
typedef float                FLOAT; 
typedef FLOAT                *PFLOAT; 
typedef BOOL near            *PBOOL; 
typedef BOOL far            *LPBOOL; 
typedef BYTE near            *PBYTE; 
typedef BYTE far            *LPBYTE; 
typedef int near            *PINT; 
typedef int far              *LPINT;   总结:关于这些布尔值之类的判断为真的情况很多,但是为假的情况一般就一种  值等于0的时候为假,所以在进行判断的时候我们可以把返回值是否为假作为判断条件。