Какие данные записываются в логические переменные сколько места в памяти они занимают
Для решения задачи в любой программе выполняется обработка каких-либо данных. Они хранятся в памяти компьютера и могут быть самых различных типов: целыми и вещественными числами, символами, строками, массивами и т.д.
Тип данных определяет:
- возможные значения переменных, констант, функций, выражений, принадлежащих к данному типу;
- внутреннюю форму представления данных в ЭВМ, т.е. способ хранения чисел или символов в памяти компьютера, размер ячейки, в которую будет записано то или иное значение;
- операции и функции, которые могут выполняться над величинами, принадлежащими к данному типу.
Область памяти, в которой хранится значение определенного типа, называется переменной. У переменной есть имя (идентификатор), тип и значение. Имя служит для обращения к области памяти, в которой хранится значение. Во время выполнения программы значение переменной можно изменить. Перед использованием любая переменная должна быть описана. Описание переменных в языке Free Pascal осуществляется в разделе описания переменных.
Обязательное описание типа приводит к избыточности в тексте программ, но такая избыточность является важным вспомогательным средством разработки программ и рассматривается как необходимое свойство современных алгоритмических языков высокого уровня. В языке Паскаль существуют скалярные и структурированные типы данных.
К скалярным типам относятся стандартные типы и типы, определяемые пользователем. Стандартные скалярные типы включают в себя целые, действительные, символьный, логические и адресный типы. Скалярные типы, определяемые пользователем, – это перечисляемый и интервальный типы.
Структурированные типы имеют четыре разновидности: массивы, множества, записи и файлы.
Рассмотрим основные типы данных.
Символьный тип данных
Данные символьного типа в памяти компьютера, как правило, занимают один байт. Это связано с тем, что обычно под величину символьного типа отводят столько памяти, сколько необходимо для хранения одного символа.
Описывают символьный тип с помощью служебного слова char.
В тексте программы значения переменных и константы символьного типа должны быть заключены в апострофы: 'а', 'b', '+'.
Целочисленный тип данных
Целочисленные типы данных могут занимать в памяти компьютера один, два, четыре или восемь байт. Диапазоны значений данных целочисленного типа представлены в табл. 1.
Логические, или булевские, данные предназначены для хранения логических значений "истина" или "ложь". Логические переменные и константы имеют тип Boolean и занимают в памяти 1 байт. Существует всего две логические константы - TRUE и FALSE. Тип Boolean - это порядковый тип, поэтому для него определены функции Ord, Pred, Succ и процедуры Inc и Dec (впрочем, довольно редко применяемые), причем Ord(FALSE) =0, Ord(TRUE) =1. Прежде чем перейти к логическим операциям, рассмотрим операции сравнения, которых в Паскале существует шесть :
<= меньше или равно;
>= больше или равно.
Операции сравнения определены для любых однотипных операндов (числовых, символьных, логических); для числовых данных, так же, как и в случае арифметических операций, сделано исключение - вы можете сравнивать два числовых выражения любых типов, но сравнивать число и символ, число и логическую величину, символ и логическую величину нельзя! Результат операции сравнения есть TRUE или FALSE, в зависимости от того, выполнено или не выполнено условие. Числа сравниваются между собой естественным образом, символы - в соответствии с их номерами, а для логических величин справедливо неравенство FALSE<TRUE. Логических, или булевских, операций в Паскале четыре :
NOT - логическое отрицание;
AND - логическое "и";
OR - логическое "или";
XOR - логическое исключающее "или".
Правила выполнения этих операций таковы :
NOT - унарная (т.е. применимая к одному операнду) операция :
NOT FALSE = TRUE , NOT TRUE = FALSE .
Правила выполнения бинарных операций AND, OR и XOR приведены в таблице 3.
Правила выполнения бинарных операций
Приоритет операции NOT (как и всякой унарной операции) наивысший, следующий приоритет у операции AND, и наинизший приоритет - у операций OR и XOR. Выражения могут содержать не только разные логические операции, но и операции сравнения и арифметические, поэтому отметим, что приоритет логических и арифметических операций выше, чем операций сравнения. Существует функция, определенная для целочисленных аргументов и имеющая логическое значение, - это функция
Она возвращает TRUE, если значение x нечетное, и FALSE, если оно четное. Логические значения можно выводить процедурой WRITE, но вводить логические переменные процедурой READ нельзя. Теперь попробуем записать программу, использующую логические данные.
VAR a,b,c,d : INTEGER;
BEGIN WRITELN('Введите 4 целых числа, a,b,c и d, среди ',
'которых должно быть 2 и только 2 одинаковых!');
WRITE('a='); READ(a); WRITELN;
WRITE('b='); READ(a); WRITELN;
WRITE('c='); READ(a); WRITELN;
WRITE('d='); READ(a); WRITELN;
WRITELN('Вашу понятливость можно оценить как ',
Программа выведет TRUE, если введенные данные удовлетворили условию, и FALSE - в противном случае.
Рассмотрим теперь битовые операции: AND, OR, XOR, ShL и ShR, которые определены для целочисленных операндов (операции AND,OR и XOR совпадают по написанию с логическими операциями, но последние определены только для логических операндов). Операции AND, OR и XOR выполняются над каждой парой соответствующих битов операндов по тем же правилам, что и логические операции, если нулевой бит считать ложным, а единичный - истинным. Приведем простой пример:
WRITELN(a AND b,' ',a OR b,' ',a XOR b);
Программа выведет числа 64, 236, 172. Каким образом они получены? Двоичное представление числа 100 равно 0110 0100, двоичное представление числа 200 равно 1100 1000. Выполним над этими числами, например, операцию XOR :
Получили двоичное число 1010 1100 = 128+32+8+4 = 172.
Операции ShL и ShR называются операциями соответственно левого сдвига и правого сдвига. Они сдвигают биты первого операнда на количество разрядов, равное значению второго операнда, освободившиеся разряды заполняются нулевыми битами. Например:
Число 10 кодируется как 0000 1010; сдвинем биты влево на 3 разряда, получим 0101 0000 = 64+16 = 80. Таким образом, сдвигая биты влево на n разрядов, мы умножаем число на 2 в степени n, а сдвигая вправо - делим на 2 в степени n. Этим свойством операций сдвига пользуются, когда в программе приходится часто умножать или делить целые числа на степень двойки, т.к. операции сдвига выполняются намного быстрее, чем арифметические опера
Тип данных определяет допустимый диапазон изменения переменных и констант, а также допустимые операции над данными этого типа. Каждая переменная и константа программы должны принадлежать к определенному типу данных. Это необходимо для того, чтобы отвести необходимое место в оперативной памяти и для проверки правильности записи выражений. Например, над числовыми данными можно производить арифметические операции, а символьные данные используются для анализа текста.
Целые типы данных используются для представления целых чисел. Целые типы, допустимый диапазон значений и требуемая память в байтах приведены в табл. 3.3.
Таблица 3.3. Целые типы данных
Размер в байтах
Целые числа или символы с кодами от 0 до 255
Целые числа или символы с кодами от-128 до 127
Целые числа от -32 768 до 32 767
Целые числа от-2 147 483 648 до 2 147 483 647
Целые числа от 0 до 4 294 967 295
Целый тип char определяется двумя способами:
- • это либо целые числа от -128 до 127;
- • либо множество символов кодовой таблицы компьютера. Каждому символу ставится в соответствие целое число от 0 до 2 8 - 1. Для кодировки используется код ASCII (American Standard Code for Information Interchange — американский стандартный код для обмена информацией). Фактически допустимыми значениями для символьного типа являются все символы клавиатуры компьютера, в том числе и управляющие символы (Esc, Tab и т. д.).
Значения символьного типа можно вводить с клавиатуры, выводить на экран и сравнивать между собой, при этом большим считается символ с большим ASCII-кодом. Для символов типа char определены операции отношения =, О, ,>=, , >=, , >=, , >=, , >=, , >=, 38 до 3,4 • 10 38 для больших чисел и от -3,4 • КГ 38 до 3,4 • КГ 38 и занимает в памяти четыре байта. Для данных этого типа определены арифметические операции +, —, *, / (результат выполнения этих операций — вещественного типа float), операции отношения =, О, , >=, 308 до 1,7 • Ю 308 для боль-
Таблица 3.4. Вещественные типы данных
Размер в байтах
Числа от 3.4Е-38 до 3.4Е+38 Точность представления — семь значащих цифр
Вещественный с двойной
Числа от 1.7Е-308 до 1.7Е+308.
15 значащих цифр
Вещественный с повышенной точностью
Числа от 3.4Е-4932 до 3.4Е+4932.
19 значащих цифр
ших чисел и от -1,7 • КГ 308 до 1,7 • 1(Г 308 для маленьких чисел. Переменные типа double занимают в памяти восемь байт. Для данных типа double определены арифметические операции +, —, *, / (результат выполнения этих операций — вещественного типа double), операции отношения =, <>, , >=, 4932 до 3,4 • 10 4932 для больших чисел и от -3,4 • 1СГ 4832 до 3,4 • КГ 4932 и занимает в памяти 10 байт. Для данных этого типа определены арифметические операции +, —, *, / (результат выполнения этих операций — вещественного типа long double), операции отношения =, О, , >=, , , . ;
Здесь — тип переменных, имена которых перечислены в операторе описания;
, , . — имена переменных, необходимых в программе.
int x,y,z; IIоператор объявления переменных х, у, z типа int
double а, b; //оператор объявления переменных а, b типа double
//оператор объявления переменной t типа float
При описании переменных под каждую из них резервируется память. Размер отведенной памяти зависит от типа переменных. При этом никаких значений в зарезервированную память не заносится.
Оператор определения переменных имеет следующий синтаксис:
Здесь — тип переменных, имена которых перечислены в операторе описания;
, , . — имена переменных, необходимых в программе;
, — начальные значения, заносимые компилятором до выполнения программы.
При описании переменных под каждую из них резервируется память. Размер отведенной памяти зависит от типа переменных. После этого компилятор заносит начальное значение в область памяти соответствующей переменной. Например:
double s = 0; //переменной s задано начальное значение равное О
В языке C++ объявлять и определять переменные можно в любом месте программы, однако область их действия начинается с момента объявления и заканчивается ближайшей за этой переменной закрывающейся фигурной скобкой. То есть область определения и действия переменной ограничена блоком, внутри которого она описана.
Именованные константы используются как переменные, значение которых не может быть изменено после инициализации. Объявляется с помощью ключевого слова const, за которым следует указание типа константы, идентификатор и значение:
const double pi = 3.14159; //объявление именованной константы pi
В некоторых случаях необходимо преобразование типов, например, чтобы присвоить целое значение выражения вещественной переменной или для согласования типов при использовании аргументов функций.
Рассмотрим простые выражения — арифметические действия. Эти выражения состоят из двух операндов, над которыми осуществляются действия, и знака операции (V, Например:
Операнд 1 + Операнд 2 — сложение.
Операнд 1 — Операнд 2 — вычитание.
Операнд 1 * Операнд 2 — умножение.
Операнд 1 / Операнд 2 — деление.
Существует три способа преобразования типов:
- • неявное преобразование типов;
- • явное преобразование типов;
- • функциональное преобразование типов.
Неявное преобразование типов. Приведение результата к типу одного из операндов называется неявным преобразованием типов:
- • если оба операнда одного типа, то и результат будет того же типа, например, в выражении 213 оба операнда целого типа, значит, и результат будет целого типа, в этом случае он будет равен целому частному от деления 2 на 3, т. е. 0
- • если операнды имеют разный тип, то тип результата будет совпадать с более широким типом операнда, например, в выражении 2/3.0 первый операнд — целого типа, второй — вещественного типа, значит, и результат будет вещественного типа, т. е. 0.6667.
Явное преобразование типов и функциональное преобразование типов. В языке C++ существует также операция явного преобразования типов
и операция функционального преобразования типов
Например, предыдущее выражение можно записать как 2 / doub 1 е 3 или 2/(double)3.
Если применить ко всему выражению операцию явного преобразования типов double (2/3 ) или операцию функционального преобразования типов (double) (2/3), то сначала будет вычислено выражение в скобках (2/3), равное 0, а затем результат будет преобразован к типу double и станет равным 0.0.
Знаки операций. Знаки операций — это лексемы, используемые при вычислении выражений. По числу операндов операции бывают:
- • унарными (с одним операндом);
- • бинарными (с двумя операндами).
Примером унарной операции может служить операция изменения знака —А (значение переменной А меняет знак на противоположный), операция определения адреса переменной &А — адрес переменной А. Операции сложения, вычитания, умножения, деления и т. д. являются бинарными.
В языке С++ используются следующие виды операций:
- • арифметические операции;
- • операции инкремента и декремента;
- • операции присваивания;
- • операции отношения;
- • логические операции.
Арифметические операции. Знаки арифметических операций используются в арифметических или алгебраических выражениях:
% — нахождение остатка от деления нацело.
Таблица 3.5. Примеры операции нахождения остатка целочисленного деления
Операции инкремента и декремента. Инкремент — это увеличение значения на 1, декремент — уменьшение значения на 1.
++ знак операции инкремента — увеличения операнда на единицу;
-- знак операции декремента — уменьшения операнда на единицу.
Операции инкремента и декремента бывают постфиксными и префиксными.
Постфиксные операции инкремента и декремента записываются после соответствующего операнда, например х++; г—;
При использовании постфиксных операций инкремента и декремента в операторе присваивания (или каком-либо другом операторе) используется старое значение операнда, и лишь после выполнения соответствующего оператора значение операнда изменяется.
Например, при выполнении операторов
переменная У примет значение, равное старому значению переменной X (1), и лишь после выполнения операции присваивания значение X увеличится на 1 и станет равно 2.
При выполнении операторов
Т-Т,--: (Т=5, затем Ъ- 4)
переменная Т примет значение, равное старому значению переменной Ъ (5), и лишь после выполнения операции присваивания значение г уменьшится на 1 и станет равно 4.
Префиксные операции инкремента и декремента записываются перед соответствующим операндом, например: + +х;, --г;.
При использовании префиксных операций инкремента и декремента в каком-либо операторе сначала изменяется значение операнда, и это новое значение операнда используется в соответствующем операторе.
Например, при выполнении операторов
сначала значение переменной X увеличится на 1 и станет равным 2, а затем это новое значение (2 ) будет присвоено переменной У.
При выполнении операторов
(7,=4:, затем Т=4)
сначала значение переменной г уменьшится на 1 и станет равным 4, а затем это новое значение (4) будет присвоено переменной Т.
Операции инкремента и декремента можно использовать и в отдельных операторах, например,
здесь значения переменных а, с будут увеличены на единицу, а значения переменных Ь, а будут уменьшены на единицу, при этом ни старые, ни новые значения этих переменных ни в каких выражениях или операторах участвовать не будут.
Знаки операций присваивания. Существуют следующие знаки операции присваивания:
= — операция присваивания (значение, стоящее справа от знака операции, присваивается переменной, стоящей слева от знака присваивания, например х-6)
+= — присваивание со сложением, запись х+=5; идентична записи х = х + 5;
- -= — присваивание с вычитанием, запись х-=3, идентична записи х = х - 3;
- *= — присваивание с умножением, запись х*= 7, идентична записи х = х * 7;
/= — присваивание с делением, запись х/=4, идентична записи х = х/4
%- — присваивание с нахождением остатка, запись х%=2, идентична записи х = х%2;
Операции отношения. Знаки операций отношения используются в условных выражениях:
= больше или равно;
где — это выражение, записанное с использованием арифметических и/или логических операций и скобок, значение которого можно вычислить;
— это переменная, в которую будет записано значение .
Правила записи арифметических выражений:
- • для получения правильного результата в нужных случаях необходимо применять операции явного или неявного преобразования типов;
- • если в числителе выражения есть хотя бы один знак сложения или вычитания, то числитель берется в скобки;
- • если знаменатель выражения содержит два и более члена, то, вне зависимости от знаков операций, знаменатель берется в скобки;
- • аргументы функций нужно брать в скобки;
- • число открывающихся скобок должно быть равно числу закрывающихся скобок;
- • операции умножения в выражении записывать обязательно (математическая запись 2х в языке С++ заменяется на 2*х).
Оператор присваивания выполняется следующим образом:
- • вычисляется значение выражения, стоящего в правой части оператора присваивания;
- • при необходимости осуществляется преобразование типа значения выражения к типу переменной, стоящей слева от знака присваивания;
- • вычисленное и преобразованное значение присваивается переменной, имя которой стоит в левой части оператора присваивания, т. е. записывается в то место оперативной памяти, которое выделено для данной переменной.
//переменной х присваивается значение, равное 5
//переменной у присваивается значение х
Приоритет операций. Приоритет операций — это порядок выполнения операций в выражении. Выполнение каждой операции происходит с учетом ее приоритета.
Приоритет операций в выражении без скобок:
- 3) ! — логическое отрицание;
- 4) && — логическое И;
- 5) || — логическое ИЛИ;
- 6) =,<>, ,>=, , >=, /* директива препроцессора для подключения
стандартной библиотеки ввода-вывода*/
const double Pi = 3.14 //определ. вещественной константы Pi
int main () //заголовок функции main()
double R, S; //оператор описания вещественных переменных R и S
printf ("Введите радиус круга "); /* вывод приглашения
к вводу значения радиуса*/ scant (" % 1 f" , &R) ; //ввод с клавиатуры значения
//вещественной переменной R
//оператор присваивания S значения площади круга радиуса R printf ("S = %lf " , S) ; //вывод на экран значения S
get char () ; //остановка работы программы до нажатия
//любого символа
Далее идет заголовок главной функции программы main. Эта функция должна присутствовать в каждой программе. Сразу же после запуска программы на выполнение операционная система компьютера передает управление функции main программы, после завершения работы функция main возвращает управление операционной системе компьютера.
Заголовок int main () указывает на то, что функция main не получает никакой информации от операционной системы компьютера (пустые круглые скобки после имени функции main). Тип данных int перед именем функции main означает, что операционной системе будет возвращено целое значение (оператором return 0 ;).
Открывающаяся фигурная скобка открывает тело функции main — блок, соответствующий функции main. Затем с помощью оператора double R, S; описываются вещественные переменные программы. На экран выводится приглашение к вводу значения радиуса, с клавиатуры вводится значение радиуса. В операторе присваивания вычисляется площадь круга, которая затем выводится на экран.
В ядре языка C++ отсутствуют средства (функции) осуществления ввода и вывода данных. Функции ввода-вывода данных содержатся в нескольких библиотеках. Рассмотрим одну из них:
stdio — STandarD Input Output library — стандартная библиотека ввода-вывода, содержит функции ввода с клавиатуры scanf() и вывода на экран дисплея printf(). Для того чтобы в программе можно было пользоваться этими функциями, нужно вначале подключить эту библиотеку. Директива препроцессора для включения в текст программы заголовочного файла библиотеки stdio имеет следующий вид:
Функция ввода scanf(): функция ввода scanf() имеет следующий синтаксис:
scanf — ключевое (зарезервированное) слово;
содержит форматные спецификации, которые показывают, каким образом интерпретировать (преобразовывать) данные, вводимые с клавиатуры.
Форматные спецификации начинаются с символа '%’ (процент), зависят от типа вводимых данных и имеют следующий вид:
Форматная спецификация для ввода чисел типа int и char
Форматная спецификация для ввода чисел типа int и char
Форматная спецификация для ввода чисел типа long int
Форматная спецификация для ввода чисел типа float в форме с фиксированной точкой
Форматная спецификация для ввода чисел типа double в форме с фиксированной точкой
Окончнаие форматных спецификаций
Форматная спецификация для ввода чисел типа float в экспоненциальной форме
Форматная спецификация для ввода символов
Форматная спецификация для ввода строк
содержит адреса переменных, значения которых вводятся с клавиатуры. Например:
Оператор scanf (" %d%lf" ,&х,&а) служит для ввода с клавиатуры значений переменных х, а . Его действие можно расшифровать следующим образом:
- • ввести с клавиатуры первое значение по форматной спецификации %d (интерпретировать его как число типа int или char);
- • записать введенное значение по адресу переменной х;
- • затем ввести с клавиатуры второе значение по форматной спецификации %lf (интерпретировать его как число типа double в форме с фиксированной точкой);
- • записать введенное значение по адресу переменной а.
При вводе с помощью таких операторов ввода сами вводимые числовые значения можно отделять одним или несколькими пробелами или размещать на разных строках, например, ввод целых переменных х и у можно осуществить следующими способами:
Функция вывода printff(). Функция вывода printfO имеет следующий синтаксис:
«форматное выражение> содержит форматные спецификации, аналогичные форматным спецификациям оператора эсаг^ (), а также строковые константы.
— это список идентификаторов переменных или констант, значения которых нужно вывести на экран дисплея. Например:
рг:тР? ("значение переменной х =%с1п" ,х) ;
На экране появится текст:
значение переменной х =4
Форматы вывода. Формат вывода предназначен для корректного вывода результатов работы программы и используется только при выводе значений числовых переменных. Формат вывода указывается в операторе сразу после символа «%» и перед соответствующей форматной спецификацией.
1. Для вещественных чисел используется формат с фиксированной точкой (использовать обязательно, иначе по умолчанию вывод будет в формате с плавающей точкой.
Например, 1.2300000000000000000000Е+00 вместо 1.23). Для вещественных переменных формат вывода имеет вид:
где указывает общее количество позиций для вывода всего числа вместе с десятичной точкой и знаком;
указывает количество позиций для вывода дробной части числа;
If — форматная спецификация для вывода данных типа double; f — форматная спецификация для вывода данных типа float;
В C сколько места занимает bool (boolean)? Это 1 бит, 1 байт или что-то еще? Имеет ли значение, является ли программа 32-разрядной или 64-разрядной?
Если вы имеете в виду C99 _Bool попробуй:
обратите внимание, что стандарт говорит:
6.2.5
объект, объявленный как тип _Bool достаточно большой, чтобы хранить значения от 0 и 1.
размер не может быть меньше одного байта. Но было бы законно быть больше одного байта.
самая маленькая адресуемая "вещь" в C-это char . Каждая переменная в C должна иметь уникальный адрес, поэтому ваш bool не может быть меньше. (Обратите внимание, что char не всегда 8 бит, хотя)
в более старых стандартах C такой тип не был определен. Многие встроенные микроконтроллеры, однако, включают специальные схемы для эффективной обработки однобитовых флагов; некоторые позволяют такую обработку переменных, хранящихся в любом месте, в то время как другие позволяют только переменные, хранящиеся в определенной области памяти. Компиляторы для таких процессоров позволяют объявлять отдельные переменные статической длительности как тип "бит"; такие переменные обычно занимают только один бит памяти (выделяется, при необходимости, в пределах региона, который может вместить такое использование). Некоторые компиляторы позволят автоматическим переменным нерекурсивных подпрограмм объявляться как тип "бит", но будут молча рассматривать их как "статические" (компоновщики, снабженные такими компиляторами, требуют, чтобы подпрограммы определяли, какие другие подпрограммы они вызывают, и будут отклонять программы, в которых подпрограммы, не помеченные как повторно входящие, вызывают друг друга взаимно рекурсивным образом).
несколько очков отмечая:
- процессоры, компиляторы которых поддерживают" истинные " битовые переменные, обычно могут устанавливать, очищать или разветвлять значения таких переменных быстрее и с меньшим количеством кода, чем они могли бы устанавливать, очищать или разветвлять флаги в байтах;
- многие такие процессоры имеют очень небольшое количество ОЗУ. На многих процессорах вопрос о том, берут ли отдельные переменные (в отличие от элементов массива или полей структуры) бит или байт, не стоит беспокоиться. На процессор с 25 байтами памяти, однако, есть огромная разница между 16 флагами, принимающими по одному байту каждый, по сравнению со всеми 16 флагами, объединенными в два байта.
- по крайней мере, в компиляторах, которые я видел, битовые переменные не могут использоваться в качестве полей структуры или элементов массива, а также не могут принимать адрес одного.
Я не знаю достаточно о C99 или более поздних версиях стандартов C или C++, чтобы знать, имеют ли они какую-либо концепцию автономного битового типа, который адреса нет. Я не могу придумать никакой причины, по которой такая вещь не должна быть возможной, особенно стандарты уже признают концепцию таких вещей, как битовые поля структуры, которые ведут себя как lvalues, но не имеют адресов. Некоторые компоновщики могут не поддерживать такие переменные, но такие компоновщики могут быть приспособлены, делая их фактический размер зависимым от реализации (действительно, помимо скорости программы или общего использования памяти, было бы невозможно сказать, были ли такие переменные заданы 1 бит или 64 бит каждый).
однако не ожидайте, что это будет немного. необходимость любого указателя быть приведенным к void* , а затем обратно и сохранить то же значение делает это невозможным, поскольку void* адресует байты. Кстати, это одна из причин, почему отдельные поля (как в int myvalue:2) не могут быть рассмотрены.
обычно нет никакой разницы в 32 или 64 построить как 32 или 64 бит, там связано с размером указателя.
обычно он занимает один байт (8 бит). Обычный код, который я использую, чтобы убедиться, что размеры типов-это то, что я думаю. Пример вывода в комментарии говорит, что мой char - 1 байт (8 бит), и то же самое для bool.
точный размер логического значения будет специфичен для компилятора, но всегда будет не менее одного байта.
не имеет значения, находитесь ли вы в 32-битном или 64-битном, это размер инструкций для процессора, совершенно другое дело.
bool принимает реальный 1 бит, так как вам нужно только 2 разных значения. Однако, когда вы делаете sizeof (bool), он возвращает 1, Что означает 1 байт. По практическим причинам оставшиеся 7 бит заполнены.
вы не можете хранить переменную размером менее 1 байта.
- > bool занимает 1 байт
нет логического типа. При ветвлении нулевое значение рассматривается как false, а все остальные-как true.
самый маленький тип в c-char, который занимает один байт почти в каждой системе. Можно использовать биты символа для хранения восьми логических значений.
Читайте также: