bool和BOOL类型知识集合

知识点一、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类型变量。这时,只要引入头文件 <stdbool.h>,就能在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<stdbool.h>

这个头文件定义了bool,true,false等宏。

#ifndef__cplusplus

如果不是C++,是纯C,那么,定义宏bool相当于_Bool类型。

#definebool _Bool

#definetrue 1

#definefalse 0

#else/* __cplusplus */

如果是C++,那么定义_Bool类型为bool类型。

/*Supporting <stdbool.h> 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\n",sizeof(bool));

printf("sizeof(char):%d\n",sizeof(char));

printf("sizeof(int):%d\n",sizeof(int));

printf("sizeof(long):%d\n",sizeof(long));

--sizeof(bool):1

--sizeof(char):1

--sizeof(int):4

--sizeof(long):8

看来gcc是用char来实现_Bool类型的。

看看给_Bool类型赋值会怎样:

boolboolean=-11212112;

printf("boolean:%d\n",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的时候为假,所以在进行判断的时候我们可以把返回值是否为假作为判断条件。

时间: 2024-07-29 06:50:50

bool和BOOL类型知识集合的相关文章

delphi编程里bool跟boolean类型的区别

原文来自: http://blog.csdn.net/shao9900/article/details/44000825 bool是LongBool类型. Delphi中定义了四种布尔类型:Boolean,ByteBool,WordBool和LongBool.后面三种布尔类型是为了与其他语言兼容而引入的,一般情况下建议使用Boolean类型. 这四种类型的布尔值占用内存的数量如下: Boolean 1 Byte ByteBool 1 Byte WordBool 2 Bytes(1 Word) L

delphi编程里的bool跟boolean类型有什么区别

bool是LongBool类型. Delphi中定义了四种布尔类型:Boolean,ByteBool,WordBool和LongBool.后面三种布尔类型是为了与其他语言兼容而引入的,一般情况下建议使用Boolean类型.这四种类型的布尔值占用内存的数量如下:Boolean 1 ByteByteBool 1 ByteWordBool 2 Bytes(1 Word)LongBool 4 Bytes(2 Words)对于ByteBool,WordBool和LongBool三种类型True常量的值为非

c++ 中 BOOL与bool TRUE与true FALSE与false 区别 (转载)

http://blog.chinaunix.net/uid-28458801-id-3941112.html 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

C++中UINT32和INT32以及int,BOOL和bool的区别

在AndroidHAL层开发中,编写C++代码的时候,遇到了数据类型的困扰,经过查找资料,总结如下: 1.UNIT32和int以及INT32的区别: (1).int默认是signed int.也就是有符号整型,最高位是符号位.数据只占31位. (2).INT32是unsigned int的别名.typedef unsigned int UINT32 unsigned int是无符号整型,最高位也是数据位,数据占32位. (3).INT32表示32位有符号的整数. (4).UINT32和INT32

OC -- BOOL与bool的区别

下面的情况,BOOL与bool可以通用 BOOL(bool)  b1 = YES;   // 输出1 BOOL(bool) b2 = 1;    // 输出1 BOOL(bool) b3 = NO;   // 输出0 BOOL(bool) b4 = 0;    // 输出0 BOOL与bool的区别如下: BOOL b5 = 2;   // 输出2 BOOL b6 = -2: // 输出-2 bool b7 = 2;   // 输出1 bool b8 = -2;    // 输出1

java编程排序之自定义类型的集合,按业务需求排序

自定义引用类型放入集合中,按实际业务需求进行排序的两种思路 第一种思路: (1)自定义实体类实现java.lang.Comparable接口,重写public int compareTo(Object obj)方法.自定义业务比较规则 (2)利用java.util.Collections类的静态方法sort(List<自定义类型> list)进行排序(默认升序)或者.自己编写排序工具类.冒泡+compareTo(obj)方法 第二种思路 (1)自己编写业务比较规则类.实体类不用实现任何借口.业

再谈怎样以最简单的方法将泛型为String类型的集合或String类型的数组转化为逗号间隔字符串形式

今天review代码,看见某些大爷在将泛型为String类型的集合或String类型的数组转化为逗号间隔字符串形式时仍然仅仅顾结果不注重过程,"大爷"咱能负点责任吗? 将泛型为String类型的集合转化为逗号间隔字符串形式: 測试类: package com.ghj.packageofclient; import java.util.ArrayList; import java.util.List; import com.ghj.packageoftool.StringUtils; p

子界类型、集合类型、记录类型、文件类型

子界类型 如果我们定义一个变量i为integer类型,那么i的值在微型机系统的pascal中,使用2字节的定义表示法,取值范围为-32768-32767.而事实上,每个程序中所用的变量的值都有一个确定的范围. 例如,人的年龄一般不超过150,一个班级的学生不超过100人,一年中的月数不超过12,一月中的天数不超过31,等等. 如果我们能在程序中对所用的变量的值域作具体规定的话,就便于检查出那些不合法的数据,这就能更好地保证程序运行的正确性.而且在一定程度上还会节省内存空间. 子界类型就很好解决如

再谈如何以最简单的方法将泛型为String类型的集合或String类型的数组转化为逗号间隔字符串形式

今天review代码,看见某些大爷在将泛型为String类型的集合或String类型的数组转化为逗号间隔字符串形式时仍然只顾结果不注重过程,"大爷"咱能负点责任吗? 将泛型为String类型的集合转化为逗号间隔字符串形式: 测试类: package com.ghj.packageofclient; import java.util.ArrayList; import java.util.List; import com.ghj.packageoftool.StringUtils; pu