Windows: Насколько большой BOOL? - PullRequest
6 голосов
/ 04 декабря 2009

Насколько велик (в бит ) тип данных Windows BOOL ?

Microsoft определяет тип данных BOOL как:

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

      typedef int BOOL;

Что превращает мой вопрос в:

Насколько большим (в битах) является тип данных int ?


Редактировать: до K & R.


Редактировать 2: о чем подумать

Притворимся мы создаем типизированный язык программирования и компилятор. У вас есть тип, который логически представляет что-то True или False . Если ваш компилятор также может ссылаться на библиотеки DLL Windows и вы хотите вызвать API, который требует тип данных BOOL , какой тип данных из вашего языка вы передадите / вернете?

Чтобы взаимодействовать с типом данных Windows BOOL, вы должны знать, насколько велика BOOL. Вопрос преобразуется в величину int . Но это C / C ++ int, а не тип данных Integer в нашем притворном языке.

Так что мне нужно либо найти, либо создать тип данных того же размера, что и int.

Примечание: В моем первоначальном вопросе я не создаю компилятор. Я звоню в Windows с языка, отличного от C / C ++, поэтому мне нужно найти тип данных того же размера, что и Windows.

Ответы [ 7 ]

31 голосов
/ 04 декабря 2009

int официально является «целочисленным типом, который больше или равен размеру типа short int и короче или равен размеру типа long». Это может быть любой размер и зависит от реализации.

Это 4 байта (32 бита) в текущей реализации компилятора Microsoft (это зависит от компилятора, а не от платформы). Вы можете увидеть это на странице Основные типы (C ++) MSDN (внизу).

Размеры основных типов

Type                    Size
======================= =========
int, unsigned int       4 bytes
7 голосов
/ 04 декабря 2009

зависит от платформы, но легко узнать:

sizeof(int)*8
4 голосов
/ 04 декабря 2009

С точки зрения кода, вы всегда можете определить размер в битах любого типа через:

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

sizeof (BOOL) * CHAR_BIT

Однако, с точки зрения семантики , число битов в BOOL должно составлять один . То есть все ненулевые значения BOOL должны обрабатываться одинаково, включая значение TRUE . FALSE (что равно 0) - это единственное другое значение, которое должно иметь различное значение. Чтобы строго следовать этому правилу, нужно немного подумать. Например, чтобы привести BOOL к персонажу, вы должны сделать следующее:

char a_CHAR_variable = (char) (0 != b_A_BOOL_variable);

(Если бы вы просто выполняли непосредственное приведение, то такие значения, как (1

char a_CHAR_variable = !!b_A_BOOL_variable;

Если вы пытаетесь использовать различные различные значения BOOL для какой-либо другой цели, скорее всего, то, что вы делаете, либо неверно, либо, по крайней мере, приведет к чему-то не поддерживаемому.

Именно из-за этих сложностей в языке C ++ фактически добавлен добросовестный тип bool.

2 голосов
/ 04 декабря 2009

Это зависит от реализации. (Даже в той же ОС.) Используйте sizeof(int), чтобы найти размер int в реализации, которую вы используете в данный момент. Вы никогда не должны жестко программировать это в своей программе на Си.

Еще лучше, используйте sizeof(BOOL), чтобы вам не пришлось беспокоиться, если MS когда-либо изменит свое определение BOOL.

2 голосов
/ 04 декабря 2009

Оба имеют размер 32 бита (4 байта).

В языках с собственным логическим типом логические значения обычно имеют размер 8 бит (1 байт), а не 1 бит, как я когда-то думал.

1 голос
/ 04 декабря 2009

Он такой же большой, как и sizeof (int)?

(это в байтах, умножьте на 8).

0 голосов
/ 05 октября 2014

В Windows 7 x64 и C # 2010 sizeof (bool) дает ответ 1, тогда как sizeof (int) дает ответ 4.

Следовательно, ответ на вопрос «насколько велико в битах - это bool» - это 8, и это не то же самое, что int.

...