布尔型数据是计算机科学中取值只有真与假两种的数据类型,通常写作 true 与 false,其名称取自数学家乔治·布尔。[1] 它用一个量表示逻辑命题是否成立,是布尔代数在程序中的直接体现,也是条件判断、循环控制与数字电路设计中最基本的构件。[2]
定义
布尔型数据的取值集合只有两个元素,即真与假,程序中一般写作 true 和 false,也有语言改用 1 与 0 表示,或规定任意非零值都算作真。[3] 它属于原始数据类型,变量既可以直接赋值,也可以由比较运算或逻辑运算的结果得到。[2]
有些语言把布尔类型的取值扩展到两个以上。ISO SQL:1999 规定 SQL 布尔量可以是真、假或未知,其中未知由数据库的空值承担;这种安排与排中律不符,但在查询中便于表达信息缺失的情形。[1] 例如 PostgreSQL 的 boolean 类型本身只有 true 与 false 两种状态,第三个状态 unknown 由空值表示。[4]
原理
从存储角度看,两个状态只需一个二进制位即可容纳,因此布尔变量可以看成长度为一的位串,或者只保留一位的数值变量。[2] 实际实现中布尔值往往占用一个完整的机器字而非单独一位,这与计算机按块传送信息的方式有关。[3] 不同语言给出的存储与转换规则并不一致,微软的文档指出,数值转成布尔值时 0 变为假、其余值变为真,布尔值转成数值时假变为 0、真变为 -1。[5]
布尔值之间的运算与布尔代数一一对应。记取值域为 $B = {0, 1}$,与、或、非等联结词分别对应合取、析取与否定,每种输入组合的结果可以用真值表完整列出。[6] 多数语言都支持与、或、非、异或一类运算,比较运算符也通常被定义为返回布尔值。[2]
布尔值与其他类型之间的转换规则由各语言自行规定。PostgreSQL 不允许把布尔值直接强制转换成其他类型,需要改写为 CASE 表达式才能得到等价效果。[4] 在列式数据库 Amazon Redshift 中,布尔值占用单字节列,输出时统一记作 t 与 f,空值代表未知状态。[7]
发展历程
布尔型数据的名称来自英国数学家乔治·布尔。他于 1847 年出版《逻辑的数学分析》,又于 1854 年出版《思维规律的研究》,用符号和代数方法处理逻辑推理,构造出以 0 和 1 表示真假的代数系统,后人称之为布尔代数。[8] 这套体系后来成为数字计算机开关电路设计的重要数学工具。[8]
1938 年,克劳德·香农发表论文《继电器与开关电路的符号分析》,说明布尔代数适合描述由继电器和开关组成的电路,把真与假对应到电路的通与断,从而将数字电路设计从经验技艺推进为可计算的理论。[9] 该文后来被看作计算机出现之前最重要的理论步骤之一,其影响延续到真空管、晶体管乃至集成电路时代。[10]
在程序设计语言里,最早提供显式布尔类型的语言之一是 1960 年的 ALGOL 60,它具有真、假两个值与若干逻辑运算符;FORTRAN IV 于 1962 年也加入 LOGICAL 类型、.TRUE. 与 .FALSE. 字面量以及逻辑运算符。[3] 同期的 Lisp 采用另一种思路,没有内置布尔类型,而是以空表代表假、其余任何值代表真,这一做法为后来的脚本语言所沿用。[3]
C 语言最初的标准没有布尔类型,比较与逻辑运算直接返回整数 0 或 1,布尔值长期借用整数变量保存;直到 1999 年的 C99 标准才补上内置布尔类型。[3] 1978 年的 Pascal 把 Boolean 作为预定义的枚举类型引入,此后带枚举的语言多沿用这一设计。ISO SQL:1999 则把布尔确立为标准类型,并允许出现未知值。[3]
应用
在程序中,布尔值主要出现在条件语句与循环控制里,if、while、for 等结构通过测试布尔表达式决定执行路径;函数也常返回布尔值,用来表示某个条件是否成立。[2] 它同时适合承载只有两种状态的设置项,如真/假、是/否、开/关。[5]
在数据库中,布尔字段用来记录二值状态,例如客户是否有效、订单是否已支付,从而简化查询条件。[7] 若建表时未给布尔列指定默认值,插入默认值相当于写入空值,这一点在使用时需要留意。[7]
在数字逻辑设计中,与门、或门、非门等基本门电路承担布尔运算,是集成电路与计算机组成的基础。[11] 香农在论文中说明,凡能用有限步骤并以 if、or、and 一类词完整描述的运算,都可以交给继电器自动完成。[10]
在计算理论中,判定布尔公式是否存在成真赋值的问题被称为布尔可满足性问题,它是第一个被证明为 NP 完全的问题。 这类问题在电路布局与逻辑化简、任务调度、网络路由等工程领域都有实际对应。[12]
局限
两个取值不足以刻画部分成立、程度高低或尚未确定的判断。ISO SQL:1999 之所以为布尔量增加未知这一状态,正是为了在二值框架下容纳信息缺失的情形,而这种扩展并非所有语言都提供。[1]
布尔值与数值之间的隐式转换容易引出错误代码。C 语言把任何非零值都视为真,于是判断某变量是否等于真与直接判断该变量本身并不等价。[3] 微软的文档也强调布尔值不以数字方式存储,不应编写依赖真、假对应数值的代码,更不应用布尔变量保存数值。[5]
布尔值不能随意与其他类型互转。在 PostgreSQL 中,把它强制转换成其他类型是不允许的,只能通过 CASE 表达式间接取值;该类型本身占用 1 字节存储。[4] 部分数据库客户端不支持布尔类型,只能以 1 和 0 代替真与假来显示。[13]
从计算代价看,一般布尔公式的可满足性判定在最坏情况下非常困难:SAT 是 NP 完全问题,尚无已知的多项式时间精确算法,实践中只能依靠启发式方法与近似手段处理大规模实例。[12] 库克-李文定理给出的也是归约关系,并未提供快速判定任意布尔公式的办法。
参见
参考资料
- 布尔 (数据类型) . wikipedia.org [引用日期2026-09-29]
- Boolean data type - Skip to main content . epfl.ch [引用日期2026-09-29]
- Boolean data type - Wikipedia, the free encyclopedia . nlb.gov.sg [引用日期2026-09-29]
- Boolean Type . postgresql.org [引用日期2026-09-29]
- 布尔数据类型 . microsoft.com [引用日期2026-09-29]
- sql-language-reference(PDF) . oracle.com [引用日期2026-09-29]
- r_Boolean_type . amazon.com [引用日期2026-09-29]
- 走进科学院,感受数学之美! . kepu.net.cn [引用日期2026-09-29]
- Claude Shannon: Mastermind of Information Theory . ieee.org [引用日期2026-09-29]
- claude-shannon-2 . sothebys.com [引用日期2026-09-29]
- Claude Shannon - Magnet Academy . nationalmaglab.org [引用日期2026-09-29]
- NP-complete problem | IEEE Technology Navigator . ieee.org [引用日期2026-09-29]
- 布尔数据类型 . sap.com [引用日期2026-09-29]
浏览次数:0 次
阅读量:0 次 · 阅读完成量:0 次
最近更新:2026-09-29T11:46:07Z
完成率 = 阅读完成量 ÷ 阅读量,分母是阅读量不是浏览次数 —— 关了 JS 的、秒退的都在浏览次数里、不在阅读量里。 详细口径在后台的「数据统计」页。