Windows:BOOL有多大?

Ian*_*oyd 6 c windows types boolean

Windows BOOL数据类型有多大(以单位)?

微软定义布尔数据类型为:

BOOL  Boolean variable (should be TRUE or FALSE).
      This type is declared in WinDef.h as follows:

      typedef int BOOL;
Run Code Online (Sandbox Code Playgroud)

将我的问题转换为:

int数据类型有多大(以位为单位)?


编辑:在K&R之前.


编辑2:要考虑的事情

假装我们正在创建一个类型化的编程语言和编译器.您有一个类型,表示逻辑上为TrueFalse.如果您的编译器也可以链接到Windows DLL,并且您想要调用需要BOOL数据类型的API ,那么您将使用您的语言中的哪种数据类型传递/返回?

为了与Windows BOOL数据类型互操作,您必须知道BOOL的大小.问题转换为int的大小.但这是一个C/C++ int,而不是我们假装语言中的Integer数据类型.

所以我需要找到或创建一个与int相同大小的数据类型.

注意:在我原来的问题中,我不是在创建编译器.我用非C/C++语言调用Windows,所以我需要找到一个与Windows预期相同大小的数据类型.

Ree*_*sey 31

int是正式的"整数类型,大于或等于short int类型的大小,并且短于或等于long类型的大小." 它可以是任何大小,并且是特定于实现的.

它是4字节(32位),在Microsoft的当前编译器实现上(这是特定于编译器的,而不是特定于平台的).您可以在MSDN 的基本类型(C++)页面(靠近底部)上看到这一点.

基本类型的大小

Type                    Size
======================= =========
int, unsigned int       4 bytes
Run Code Online (Sandbox Code Playgroud)

  • 为什么-1?我在这里引用了MSDN中的海峡,这是Windows的主要推荐来源.在Microsoft的平台上,用他们自己的话说,在Windows上不能保证32位,但Visual C++将其指定为32位. (5认同)

cat*_*alk 7

它取决于平台,但很容易找到:

sizeof(int)*8
Run Code Online (Sandbox Code Playgroud)


Pau*_*ieh 5

在代码方面,您始终可以通过以下方式计算出任何类型的位大小:

#include <windows.h>
#include <limits.h>

sizeof (BOOL) * CHAR_BIT
Run Code Online (Sandbox Code Playgroud)

但是,从语义的角度来看, BOOL 中的位数应该是1。也就是说,所有 BOOL 的非零值都应该一视同仁,包括TRUE的值。FALSE(即 0)是唯一应该具有特殊含义的其他值。严格遵守这条规则实际上需要一些思考。例如,要将 BOOL 转换为字符,您可以执行以下操作:

char a_CHAR_variable = (char) (0 != b_A_BOOL_variable);
Run Code Online (Sandbox Code Playgroud)

(如果您只是直接强制转换,那么 (1 << 8) 之类的值将被解释为 FALSE 而不是 TRUE。)或者如果您只想通过以下方式完全避免多值问题:

char a_CHAR_variable = !!b_A_BOOL_variable;
Run Code Online (Sandbox Code Playgroud)

如果您尝试将 BOOL 的各种不同值用于其他目的,那么您所做的很可能是错误的,或者至少会导致无法维护的事情。

由于这些复杂性,C++ 语言实际上添加了一个真正的 bool 类型。