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值。
知识点三、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的时候为假,所以在进行判断的时候我们可以把返回值是否为假作为判断条件。
bool和BOOL类型知识集合的更多相关文章
- 2016年11月3日JS脚本简介数据类型: 1.整型:int 2.小数类型: float(单精度) double(双精度) decimal () 3.字符类型: chr 4.字符串类型:sting 5.日期时间:datetime 6.布尔型数据:bool 7.对象类型:object 8.二进制:binary 语言类型: 1.强类型语言:c++ c c# java 2.弱类型语
数据类型: 1.整型:int 2.小数类型: float(单精度) double(双精度) decimal () 3.字符类型: chr 4.字符串类型:sting 5.日期时间:datetime 6 ...
- delphi编程里的bool跟boolean类型有什么区别
bool是LongBool类型. Delphi中定义了四种布尔类型:Boolean,ByteBool,WordBool和LongBool.后面三种布尔类型是为了与其他语言兼容而引入的,一般情况下建议使 ...
- NSInteger和BOOL的底层类型
在Objective-C中,NSInteger和BOOL是通过typedef或者#define宏进行定义的,那么,这两个数据类型的底层类型是什么呢? 首先查看NSInteger的定义: #if __L ...
- 关于bool和BOOL的区别
1.类型不同: BOOL是int类型,bool是布尔类型 2.长度不同: BOOL长度是其环境来定,一般是4个字节,因为其是int类型;bool长度为一个字节 3.取值不同: BOOL取值是FALSE ...
- c++ 中 BOOL与bool TRUE与true FALSE与false 区别
转自:http://blog.chinaunix.net/uid-28458801-id-3941112.html FALSE/TRUE与false/true的区别 1.FALSE/TRUE与fa ...
- C++中UINT32和INT32以及int,BOOL和bool的差别
在AndroidHAL层开发中,编写C++代码的时候.遇到了数据类型的困扰.经过查找资料,总结例如以下: 1.UNIT32和int以及INT32的差别: (1).int默认是signed int.也就 ...
- linq之将IEnumerable<T>类型的集合转换为DataTable类型 (转载)
在考虑将表格数据导出成excel的时候,网上搜的时候找到一个特别合适的公共方法,可以将query查询出来的集合转换为datatable 需引用using System.Reflection; publ ...
- 6-12 varchar和char 枚举类型enum 集合set
1 字符类型char和varchar #官网:https://dev.mysql.com/doc/refman/5.7/en/char.html #注意:char和varchar括号内的参 ...
- PYTHON-基本数据类型-元祖类型,字典类型,集合类型
内容: 1. 元组 2. 字典 3. 集合=========================== 元祖类型什么是元组: 元组就是一个不可变的列表============================ ...
随机推荐
- Ogre 编辑器三(自动生成与更新Ogre对象编辑界面)
最开始设计这个编辑器时,其中一个要求就是能在运行过程中,通过UI来更新各对象,这样我们就能明确每个Ogre对象更新其属性影响的渲染效果.比如点光源,方向光源,聚光灯各属性与效果,深度测试开启与关闭,深 ...
- SAP SD 顾问面试问题 consultant interview questionnaire
以下是我个人目前面试团队 SD顾问问题的小结,希望对大家有所帮助, 也可能有回答错误的地方,希望同行不吝赐教. 也希望各位顾问们讲你们遇到的一些面试问题做个跟贴,方便大家共同进步,谢谢. 面试问题 ...
- linux下硬盘的分区:
提到硬盘的分区,以前就是很乱,有什么主分区/扩展分区/逻辑分区等;它们有什么区别呢?现在简单的了解一下: 由于在MBR的主引导记录中的分区表里面最多只能记录4个分区记录,这个不够用啊,为了解决这个问题 ...
- visual studio code 写c++代码
首先安装c++插件: 安装 LLVM clang 下载地址:http://releases.llvm.org/ 解决方法:点击黄色灯泡 进入 c_cpp_properties.json文件, 在 pa ...
- LintCode #3 统计数字
解题思路请参考 代码(可以通过,不过很乱,需要整理): /// <summary> /// 计算n在数组[targetNum]中出现的次数 /// 形如:[0, 1, 2, 3, 4, 5 ...
- Ironic 安装和配置详解
转自:http://amar266.blogspot.com/2014/12/ironic-installation-and-configuration.html 1.Install Openstac ...
- 全新升级的WiFi无线上网短信认证系统,适用于咖啡厅、足浴等公共场所,提高门门店营业收入
WiFi无线上网短信认证系统经历从1.0到1.88的升级,都是用户在使用过程中,提出宝贵的意见,一直修复至今,有着非常稳定的版本. 这个软件有什么作用?WiFi为什么要认证呢? 其实这个只是获取用户联 ...
- 视锥体(frustum)裁剪
原文地址:http://www.linuxgraphics.cn/graphics/opengl_view_frustum_culling.html 背景 视锥体(frustum),是指场景中摄像机的 ...
- Xcode: Show Bounds Rectangles for UIView in Interface Builder
选中一个 Xib 文件,然后依次选择菜单中的 Editor - Canvas - Show Bounds Rectangles
- java mysql 链接高版本出现SSL验证
key1: String url="jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf-8 ...