Windows BOOL数据types有多大(以位为单位 )?
Microsoft将BOOL数据types定义为:
BOOL Boolean variable (should be TRUE or FALSE). This type is declared in WinDef.h as follows: typedef int BOOL;
它将我的问题转换成:
一个int数据types有多大(以位为单位)?
编辑:在K&R之前。
假装我们正在创build一个types化的编程语言和编译器。 你有一个逻辑上是True或False的types 。 如果您的编译器也可以链接到Windows DLL,并且您想调用一个需要BOOL数据types的API,那么您传递或返回的语言中的数据types是什么?
为了与Windows BOOL数据types互操作,您必须知道BOOL有多大。 问题被转换成一个int值。 但是这是一个C / C ++ int,而不是我们假装语言中的Integer数据types。
所以我需要find或创build一个与int相同大小的数据types。
注意:在我原来的问题,我没有创build一个编译器。 我从一个不是C / C ++的语言调用Windows,所以我需要find一个与Windows期望的大小相同的数据types。
int是正式的“大于或等于short int类型的大小,并且小于或等于long类型的大小的整数类型”。 它可以是任何大小,并且是特定于实现的。
它是4个字节(32位),在微软当前的编译器实现(这是编译器特定的,而不是平台特定的)。 您可以在MSDN的基本类型(C ++)页面(靠近底部)看到这一点。
基本类型的大小
Type Size ======================= ========= int, unsigned int 4 bytes
这是平台相关的,但容易发现:
sizeof(int)*8
就代码而言,你总是可以通过以下任何类型的位来计算大小:
#include <windows.h> #include <limits.h> sizeof (BOOL) * CHAR_BIT
但是,从语义角度来看,BOOL中的位数应该是1 。 也就是说,BOOL的所有非零值应该被同等对待,包括TRUE的值。 FALSE (这是0)是唯一具有区别意义的其他值。 严格遵循这个规则实际上需要一些思考。 例如,要将一个BOOL向下转换为一个字符,您需要执行以下操作:
char a_CHAR_variable = (char) (0 != b_A_BOOL_variable);
(如果您只是直接进行投射,那么像(1 << 8)这样的值将被解释为FALSE而不是TRUE。)或者,如果您只想通过以下方法完全避免多值问题:
char a_CHAR_variable = !!b_A_BOOL_variable;
如果你正在尝试将BOOL的各种不同的值用于其他目的,那么你正在做的事情可能是错误的,或者至少会导致一些不可维护的事情。
由于这些复杂性,C ++语言实际上增加了一个bonafide bool类型。
这取决于实施。 (即使在同一个操作系统上。)使用sizeof(int)
来查找当前使用的实现的int大小。 你不应该硬编码到你的C程序中。
更好的是,使用sizeof(BOOL)
所以你不必担心MS是否改变了BOOL的定义。
它们都是32位大(4字节)。
在具有本机布尔类型的语言中,布尔值通常是8位大(1字节),而不是像我曾经想到的那样是1位。
它和sizeof(int)一样大吗?
(这是字节乘以8)
在Windows 7 x64和C#2010 sizeof(布尔)给出了1的答案,而sizeof(int)给出了4的答案。
因此,“有多大就是一个bool”的答案是8,而不是一个整数。