Каждая переменная имеет определенный тип. И этот тип определяет, какие значения может иметь переменная, какие операции с ней можно производить и сколько байт в памяти она будет занимать. В языке C++ определены следующие базовые типы данных: логический тип bool , целочисленные типы, типа чисел с плавающей точкой, символьные типы. Рассмотрим эти группы по отдельности.
Логический тип
Логический тип bool может хранить одно из двух значений: true (истинно, верно) и false (неверно, ложно). Например, определим пару переменных данного типа и выведем их значения на консоль:
#include int main() < bool isAlive ; bool isDead ; std::cout
При выводе значения типа bool преобразуются в 1 (если true) и 0 (если false). Как правило, данный тип применяется преимущество в условных выражениях, которые будут далее рассмотрены.
Значение по умолчанию для переменных этого типа — false .
Целочисленные типы
Целые числа в языке C++ представлены следующими типами:
Типы данных в C++. C++ для начинающих. Урок #4.
- signed char : представляет один символ. Занимает в памяти 1 байт (8 бит). Может хранить любой значение из диапазона от -128 до 127
- unsigned char : представляет один символ. Занимает в памяти 1 байт (8 бит). Может хранить любой значение из диапазона от 0 до 255
- char : представляет один символ в кодировке ASCII. Занимает в памяти 1 байт (8 бит). Может хранить любое значение из диапазона от -128 до 127, либо от 0 до 255 Несмотря на то, что данный тип представляет тот же диапазон значений, что и вышеописанный тип signed char , но они не эквивалентны. Тип char предназначен для хранения числового кода символа и в реальности может представлять как signed byte , так и unsigned byte в зависимости от конкретного компилятора.
- short : представляет целое число в диапазоне от –32768 до 32767. Занимает в памяти 2 байта (16 бит). Данный тип также имеет псевдонимы short int , signed short int , signed short .
- unsigned short : представляет целое число в диапазоне от 0 до 65535. Занимает в памяти 2 байта (16 бит). Данный тип также имеет синоним unsigned short int .
- int : представляет целое число. В зависимости от архитектуры процессора может занимать 2 байта (16 бит) или 4 байта (32 бита). Диапазон предельных значений соответственно также может варьироваться от –32768 до 32767 (при 2 байтах) или от −2 147 483 648 до 2 147 483 647 (при 4 байтах). Но в любом случае размер должен быть больше или равен размеру типа short и меньше или равен размеру типа long Данный тип имеет псевдонимы signed int и signed .
- unsigned int : представляет положительное целое число. В зависимости от архитектуры процессора может занимать 2 байта (16 бит) или 4 байта (32 бита), и из-за этого диапазон предельных значений может меняться: от 0 до 65535 (для 2 байт), либо от 0 до 4 294 967 295 (для 4 байт). Имеет псевдоним unsigned
- long : в зависимости от архитектуры может занимать 4 или 8 байт и представляет целое число в диапазоне от −2 147 483 648 до 2 147 483 647 (при 4 байтах) или от −9 223 372 036 854 775 808 до +9 223 372 036 854 775 807 (при 8 байтах). Занимает в памяти 4 байта (32 бита) или. Имеет псевдонимы long int , signed long int и signed long
- unsigned long : представляет целое число в диапазоне от 0 до 4 294 967 295. Занимает в памяти 4 байта (32 бита). Имеет синоним unsigned long int .
- long long : представляет целое число в диапазоне от −9 223 372 036 854 775 808 до +9 223 372 036 854 775 807. Занимает в памяти 8 байт (64 бита). Имеет псевдонимы long long int , signed long long int и signed long long .
- unsigned long long : представляет целое число в диапазоне от 0 до 18 446 744 073 709 551 615. Занимает в памяти, как правило, 8 байт (64 бита). Имеет псевдоним unsigned long long int .
Для представления чисел в С++ применятся целочисленные литералы со знаком или без, типа -10 или 10. Например, определим ряд переменных целочисленных типов и выведем их значения на консоль:
Основы Программирования — #2 — Типы данных
#include int main() < signed char num1< -64 >; unsigned char num2< 64 >; short num3< -88 >; unsigned short num4< 88 >; int num5< -1024 >; unsigned int num6< 1024 >; long num7< -2048 >; unsigned long num8< 2048 >; long long num9< -4096 >; unsigned long long num10< 4096 >; std::cout u или U. Литералы типов long и long long имеют суффиксы L/l и LL/ll соответственно:
#include int main() < unsigned int num6< 1024U >; // U — unsigned int long num7< -2048L >; // L — long unsigned long num8< 2048UL >; // UL — unsigned long long long num9< -4096LL >; // LL — long long unsigned long long num10< 4096ULL >;// ULL — unsigned long long std::cout #include int main() < int num< 1’234’567’890 >; std::cout
Различные системы исчисления
По умолчанию все стандартные целочисленные литералы представляют числа в привычной нам десятичной системе. Однако C++ также позволяет использовать и числа в других системах исчисления.
Чтобы указать, что число — шестнадцатеричное, перед числом указывается префикс 0x или 0X . Например:
int num1< 0x1A>; // 26 — в десятичной int num2< 0xFF >; // 255 — в десятичной int num3< 0xFFFFFF >; //16777215 — в десятичной
Чтобы указать, что число — восьмеричное, перед числом указывается ноль 0 . Например:
int num1< 034>; // 26 — в десятичной int num2< 0377 >; // 255 — в десятичной
Бинарные литералы предваряются префиксом 0b или 0B :
int num1< 0b11010>; // 26 — в десятичной int num2< 0b11111111 >; // 255 — в десятичной
Все эти типы литералов также поддерживают суффиксы U/L/LL :
unsigned int num1< 0b11010U>; // 26 — в десятичной long num2< 0377L >; // 255 — в десятичной unsigned long num3< 0xFFFFFFULL >; //16777215 — в десятичной
Числа с плавающей точкой
Для хранения дробных чисел в C++ применяются числа с плавающей точкой. Число с плавающей точкой состоит из двух частей: мантиссы и показателя степени . Оба могут быть как положительными, так и отрицательными. Величина числа – это мантисса, умноженная на десять в степени экспоненты.
Например, число 365 может быть записано в виде числа с плавающей точкой следующим образом:
3.650000E02
В качестве разделителя целой и дробной частей используется символ точки. Мантисса здесь имеет семь десятичных цифр — 3.650000 , показатель степени — две цифры 02 . Буква E означает экспоненту, после нее указывается показатель степени (степени десяти), на которую умножается часть 3.650000 (мантисса), чтобы получить требуемое значение. То есть, чтобы вернуться к обычному десятичному представлению, нужно выполнить следующую операцию:
3.650000 × 102 = 365
Другой пример — возьмем небольшое число:
-3.650000E-03
В данном случае мы имеем дело с числом –3.65 × 10 -3 , что равно –0.00365 . Здесь мы видим, что в зависимости от значения показателя степени десятичная точка «плавает». Собственно поэтому их и называют числами с плавающей точкой.
Однако хотя такая запись позволяет определить очень большой диапазон чисел, не все эти числа могут быть представлены с полной точностью; числа с плавающей запятой в целом являются приблизительными представления точного числа. Например, число 1254311179 выглядело бы так: 1.254311E09 . Однако если перейти к десятичной записи, то это будет 1254311000 . А это не то же самое, что и 1254311179 , поскольку мы потеряли три младших разряда.
В языке C++ есть три типа для представления чисел с плавающей точкой:
- float : представляет вещественное число одинарной точности с плавающей точкой в диапазоне +/- 3.4E-38 до 3.4E+38. В памяти занимает 4 байта (32 бита)
- double : представляет вещественное число двойной точности с плавающей точкой в диапазоне +/- 1.7E-308 до 1.7E+308. В памяти занимает 8 байт (64 бита)
- long double : представляет вещественное число двойной точности с плавающей точкой не менее 8 байт (64 бит). В зависимости от размера занимаемой памяти может отличаться диапазон допустимых значений.
В своем внутреннем бинарном представлении каждое число с плавающей запятой состоит из одного бита знака, за которым следует фиксированное количество битов для показателя степени и набор битов для хранения мантиссы. В числах float 1 бит предназначен для хранения знака, 8 бит для экспоненты и 23 для мантиссы, что в сумме дает 32 бита. Мантисса позволяет определить точность числа в виде 7 десятичных знаков.
В числах double : 1 знаковый бит, 11 бит для экспоненты и 52 бит для мантиссы, то есть в сумме 64 бита. 52-разрядная мантисса позволяет определить точность до 16 десятичных знаков.
Для типа long double расклад зависит от конкретного компилятора и реализации этого типа данных. Большинство компиляторов предоставляют точность до 18 — 19 десятичных знаков (64-битная мантисса), в других же (как например, в Microsoft Visual C++) long double аналогичен типу double .
В C++ литералы чисел с плавающими точками представлены дробными числами, которые в качестве разделителя целой и дробной частей применяют точку:
double num ;
Даже если переменной присваивается целое число, чтобы показать, что мы присваиваем число с плавающей точкой, применяется точка:
double num1< 1 >; // 1 — целочисленный литерал double num2< 1. >; //1. — литерал числа с плавающей точкой
Так, здесь число 1. представляет литерал числа с плавающей точкой, и в принципе аналогичен 1.0 .
По умолчанию все такие числа с точкой расцениваются как числа типа double. Чтобы показать, что число представляет другой тип, для float применяется суффикс f / F , а для long double — l / L :
float num1< 10.56f >; // float long double num2< 10.56l >; // long double
В качестве альтернативы также можно применять экспоненциальную запись:
double num1< 5E3 >; // 5E3 = 5000.0 double num2< 2.5e-3 >; // 2.5e-3 = 0.0025
Размеры типов данных
При перечислении типов данных указывался размер, который он занимает в памяти. Но стандарт языка устанавливает лишь минимальные значения, которые должны быть. Например, для типов int и short минимальное значение — 16 бит, для типа long — 32 бита, для типа long double — 64 разряда.
При этом размер типа long должен быть не меньше размера типа int, а размер типа int — не меньше размера типа short, а размер типа long double должен быть не меньше double . А разработчики компиляторов могут выбирать предельные размеры для типов самостоятельно, исходя из аппаратных возможностей компьютера.
К примеру, компилятор g++ Windows для long double использует 16 байт. А компилятор в Visual Studio, который также работает под Windows, и clang++ под Windows для long double используют 8 байт. То есть даже в рамках одной платформы разные компиляторы могут по разному подходить к размерам некоторых типов данных. Но в целом используются те размеры, которые указаны выше при описании типов данных.
Однако бывают ситуации, когда необходимо точно знать размер определенного типа. И для этого в С++ есть оператор sizeof() , который возвращает размер памяти в байтах, которую занимает переменная:
#include int main() < long double number ; std::cout sizeof(number) = 16
Символьные типы
В C++ есть следующие символьные типы данных:
- char : представляет один символ в кодировке ASCII. Занимает в памяти 1 байт (8 бит). Может хранить любое значение из диапазона от -128 до 127, либо от 0 до 255
- wchar_t : представляет расширенный символ. На Windows занимает в памяти 2 байта (16 бит), на Linux — 4 байта (32 бита). Может хранить любой значение из диапазона от 0 до 65 535 (при 2 байтах), либо от 0 до 4 294 967 295 (для 4 байт)
- char8_t : представляет один символ в кодировке Unicode. Занимает в памяти 1 байт. Может хранить любой значение из диапазона от 0 до 256
- char16_t : представляет один символ в кодировке Unicode. Занимает в памяти 2 байта (16 бит). Может хранить любой значение из диапазона от 0 до 65 535
- char32_t : представляет один символ в кодировке Unicode. Занимает в памяти 4 байта (32 бита). Может хранить любой значение из диапазона от 0 до 4 294 967 295
char
Переменная типа char хранит числовой код одного символа и занимает один байт. Стандарт языка С++ не определяет кодировку символов, которая будет использоваться для символов char, поэтому производители компиляторов могут выбирать любую кодировку, но обычно это ASCII.
В качестве значения переменная типа char может принимать один символ в одинарных кавычках, либо числовой код символа:
#include int main() < char a1 ; char a2 ; std::cout
В данном случае переменные a1 и a2 будут иметь одно и то же значение, так как 65 — это числовой код символа «A» в таблице ASCII. При выводе на консоль с помощью cout по умолчанию отображается символ.
Кроме того, в C++ можно использовать специальные управляющие последовательности, которые предваряются слешем и которые интерпретируются особым образом. Например, «n» представляет перевод строки, а «t» — табуляцию.
Однако ASCII обычно подходит для наборов символов языков, которые используют латиницу. Но если необходимо работать с символами для нескольких языков одновременно или с символами языков, отличных от английского, 256-символьных кодов может быть недостаточно. И в этом случае применяется Unicode .
Unicode (Юникод) — это стандарт, который определяет набор символов и их кодовых точек, а также несколько различных кодировок для этих кодовых точек. Наиболее часто используемые кодировки: UTF-8, UTF-16 и UTF-32. Разница между ними заключается в том, как представлена кодовая точка символа; числовое же значение кода для любого символа остается одним и тем же в любой из кодировок. Основные отличия:
- UTF-8 представляет символ как последовательность переменной длины от одного до четырех байт. Набор символов ASCII появляется в UTF-8 как однобайтовые коды, которые имеют те же значения кодов, что и в ASCII. UTF-8 на сегодняшний день является самой популярной кодировкой Unicode.
- UTF-16 представляет символы как одно или два 16-битных значения.
- UTF-32 представляет все символы как 32-битные значения
В C++ есть четыре типа для хранения символов Unicode: wchar_t , char8_t , char16_t и char32_t ( char16_t и char32_t были добавлены в C+11, а char8_t — в C++20).
wchar_t
Тип wchar_t — это основной тип, предназначенный для наборов символов, размер которых выходит за пределы одного байта. Собственно отсюда и его название: wchar_t — wide (широкий) char. происходит от широкого символа, потому что этот символ «шире», чем обычный однобайтовый символ. Значения wchar_t определяются также как и символы char за тем исключением, что они предваряются символов «L»:
wchar_t a1 ;
Также можно передать код символа
wchar_t a1 ;
Значение, заключенное в одинарные кавычки, представляет собой шестнадцатеричный код символа. Обратная косая черта указывает на начало управляющей последовательности, а x после обратной косой черты означает, что код шестнадцатеричный.
Стоит учитывать, что для вывода на консоль символов wchar_t следует использовать не std::cout , а поток std::wcout :
#include int main() < char h = ‘H’; wchar_t i ; std::wcout
При этом поток std::wcout может работать как с char, так и с wchar_t. А поток std::cout для переменной wchar_t вместо символа будет выводить его числовой код.
Проблема с типом wchar_t заключается в том, что его размер сильно зависит от реализации и применяемой кодировки. Кодировка обычно соответствует предпочтительной кодировке целевой платформы. Так, для Windows wchar_t обычно имеет ширину 16 бит и кодируется с помощью UTF-16. Большинство других платформ устанавливают размер в 32 бита, а в качестве кодировки применяют UTF-32.
С одной стороны, это позволяет больше соответствовать конкретной платформе. Но с другой стороны, затрудняет написание кода, переносимого на разные платформы. Поэтому в общем случае часто рекомендуется использовать типы char8_t , char16_t и char32_t . Значения этих типов предназначены для хранения символов в кодировке UTF-8, UTF-16 или UTF-32 соответственно, а их размеры одинаковы на всех распространенных платформах.
Для определения символов типов char8_t , char16_t и char32_t применяются соответственно префиксы u8, u и U:
char8_t c< u8’l’ >; char16_t d< u’l’ >; char32_t e< U’o’ >;
Стоит отметить, что для вывода на консоль значений char8_t/char16_t/char32_t пока нет встроенных инструментов типа std:cout/std:wcout .
Спецификатор auto
Иногда бывает трудно определить тип выражения. В этом случае можно предоставить компилятору самому выводить тип объекта. И для этого применяется спецификатор auto . При этом если мы определяем переменную со спецификатором auto, эта переменная должна быть обязательно инициализирована каким-либо значением:
auto number = 5; // number имеет тип int auto sum ; // sum имеет тип double auto distance ; // distance имеет тип unsigned long
На основании присвоенного значения компилятор выведет тип переменной. Неинициализированные переменные со спецификатором auto не допускаются:
Источник: metanit.com
Урок 2. Основы программирования. Типы данных
Пока вы учитесь программированию, придётся написать тысячи строк кода. После учёбы – ещё больше. А по сути всё это набор данных, различающихся по типам и структурам. Что такое структуры данных мы обсудим в следующих уроках, а о типах поговорим сейчас.
Данные – это информация, записанная в той форме, которая удобна компьютеру для обработки и передачи. Данные в языках программирования бывают разных типов. В JavaScript это:
— number – число;
— string – строка;
— boolean – логический тип данных;
— undefined – тип данных, у которых значение не определено;
— null – тип данных с «пустыми» значениями;
— object – тип данных, хранящий свойства и методы.
Во всех языках программирования свои типы данных и способы их обозначений. На курсе «Основы программирования» мы подробно рассмотрим три базовых типа данных в JavaScript:
— числа;
— строки;
— логические или булевы значения.
Для работы ничего дополнительно устанавливать не нужно, всё выполняется в браузере. Понадобится сайт https://codepen.io/, так называемая «песочница», где пишется код JS и сразу выводится результат.
Готовы? Начнём по порядку.
Числа
Для обозначения каждого типа данных в языках программирования используются специальные слова.
В JavaScript тип данных «число» имеет обозначение number.
Теперь посмотрим, как это работает:
1. Заходим на сайт https://codepen.io, регистрируемся и видим такое поле:
2. Во вкладке JS вводим команды:
console.log(typeof 24); console.log(typeof 24.3);
Справка! В конце каждой строки с командой в JS необходимо ставить точку с запятой. Воспринимайте это как знак препинания в обычном языке, на котором вы говорите. Поставив ; вы сообщите компьютеру, что вы закончили одну «фразу» и начинаете следующую.
Оператор typeof() говорит компьютеру о том, что необходимо вывести в консоль тип введённых данных, а не сами данные.
Результат сразу отображается во вкладке Console:
«number» «number»
Видим, что тип не отличается у обоих значений и указывается как number.
Строки
Строки – это второй базовый тип данных. В JavaScript они обозначаются как string.
В программировании строкой признаётся последовательность символов, включая буквы, числа и специальные символы (точка, запятая, кавычка, пробел и т. д.).
Справка! Числа определяются как тип данных string, если они заключены в кавычки. Тогда они признаются не числом (number), а одним из символов строки (string). Проверим:
console.log(typeof(24)); console.log(typeof(’24’));
Результат в консоли:
«number» «string»
В программах строки указывают либо в одинарных кавычках-апострофах, либо в двойных кавычках – зависит от языка. В JS разрешено использовать и двойные, и одинарные кавычки по выбору.
При использовании одинарных кавычек, сложность возникает тогда, когда внутри строки стоит такой же символ. Например, ‘It’s cloudy day’. Английское местоимение It’s включает в себя апостроф. Если мы проставим три апострофа (в начале, в слове It’s и в конце строки), то компьютер обозначит конец строки после It:
console.log(‘It’s cloudy day’);
В консоль выведется:
Как этого избежать?
В таких случаях мы используем экранирование – ставим перед символом внутри строки обратный слэш «». Тогда фраза ‘it’s cloudy day’ примет вид ‘it’s cloudy day’ и будет правильно считана:
console.log(‘It’s cloudy day’);
«It’s cloudy day»
В JavaScript мы можем писать подобные строки в двойных кавычках и результат сразу будет тот, что нужен:
console.log(«It’s cloudy day»);
«It’s cloudy day»
Каждый символ в строке имеет порядковый номер – индекс. Его используют для того, чтобы указать компьютеру, к какому конкретно символу идёт обращение.
Справка! Отсчёт начинается с 0.
Например, в слове «синий» индексы присваиваются так:
Строки можно склеивать, вырезать из них части, срезать и проводить другие операции. Рассмотрим, как это сделать.
Практика
1. Вводим в «песочнице» строку ‘hello’ с помощью команды console.log() через typeof(). В консоли увидим тип string. А если введём числовое значение без кавычек 24.3, увидим тип number:
console.log(typeof(‘hello’)); console.log(typeof(24.3));
«string» «number»
2. Попробуем ввести строку без typeof() и посмотрим на результат:
console.log(‘hello’); console.log(24.3);
«hello» 24.3
3. Выделим из строки отдельный символ. Например, букву B в слове LOFTBLOG.
Эта буква стоит в строке на 5 месте, поэтому имеет индекс 4 (помним, что нумерация с 0). Чтобы обратиться к символу, мы указываем его индекс в квадратных скобках – [4]:
console.log(‘LOFTBLOG'[4]);
Выделение фрагмента строки
Для выделения фрагмента строки (подстроки) в JS используется три метода:
substring() – срез строки, где необходимо указать только первый или первый и последний символ через запятую.
Если укажем только первый, то отбразится часть строки от него и до конца. Если первый и последний – вырежем часть строки:
console.log(‘LOFTBLOG’.substring(4)); console.log(‘LOFTBLOG’.substring(4,6));
«BLOG» «BL»
Справка! Последним считается не индекс последнего символа, который мы хотим выделить, а следующий за ним. Например, в слове LOFTBLOG, буква G имеет индекс 7, но последним считается индекс 8, так как правая граница в срез не входит.
В примере первым символом мы указали четвёртый – B, а последним тот, что находится под индексом 6. Это буква O. Но в консоли мы увидели только две буквы – BL. Это подтверждает то, что правая граница не входит в срез. Если мы захотим вырезать слово BLOG, но укажем последним символ под номером 7, а не 8, то получим:
console.log(‘LOFTBLOG’.substring(4,7));
slice() – действует так же, как и substring(), но ему допускается присваивать отрицательные значения, начиная с -1. Отсчёт начнётся с конца строки, а не с начала:
console.log(‘LOFTBLOG’.slice(4)); console.log(‘LOFTBLOG’.slice(-6));
Результат в консоли:
«BLOG» «FTBLOG»
substr() – используется для выделения фрагмента с указанием индекса начального символа и количества символов после него, включая первый:
console.log(‘LOFTBLOG’.substr(1,4));
«OFTB»
В качестве начального символа мы определили тот, что под индексом 1 – это первая O в слове LOFTBLOG. А через запятую попросили вывести 4 символа, включая его – это OFTB.
Логические (булевы) значения
Здесь за основу берутся логические выражения, на которые компьютер мог бы ответить «да, это верно» или «нет, это не верно». Буль принимает только два значения:
истина – true
ложь – false
Они используются, когда программа принимает решение о том, что делать дальше, анализируя логическое значение выражений. Например, при выполнении алгоритма «ветвление»: если выражение верно, то программа идёт по одному алгоритму, если не верно, то по другому.
Не читали наш первый урок про логику и алгоритмы? Он здесь.
В JavaScript булевы значения имеют тип boolean, писать их нужно с маленькой буквы:
console.log(typeof true); console.log(typeof false);
Консоль покажет тип:
«boolean» «boolean»
Напишем логическое выражение и посмотрим, что выводится в консоль в качестве значений. Например, «три равно три».
console.log(3==3);
Справка! Для проверки равенства в JavaScript необходимо прописывать 2 знака равно, так как одинарное равно уже используется для присваивания значений.
true
Как видим, значением логического выражения «3==3» является true, так как три действительно равно трём.
Если ввести ложное условие, то значение станет false:
console.log(3==4);
false
Преобразование типов данных
Не все типы данных совместимы в программах. Например, по умолчанию нельзя сложить строку с числом.
Чтобы не допустить ошибок, один тип необходимо преобразовать в другой.
Одна из особенностей языка JavaScript в том, что здесь выполняется неявное преобразование типов – язык сам понимает, в какой тип преобразовать данные, в зависимости от операции, которую мы выполняем.
Но в JS есть команды, которые позволяют сделать это самостоятельно – провести явное преобразование.
Для этого используются команды:
— String()
— Number()
— Boolean()
console.log(String(2323)); console.log(Boolean(‘dsgg’)); console.log(Boolean(0)); console.log(Number(2323));
«2323» true false 2323
Число 2323, написанное без кавычек, имеет тип number. С помощью команды String() мы перевели его в тип string – строка. Это видно по отображению результата.
Тип «число» указывается в консоли без кавычек. А тип «строка» в кавычках.
При преобразовании числа и строки в булевый тип, любое значение определяется, как true, кроме числового значения 0.
Если 0, написано как ‘0’, то это тип данных string и он определится, как true, а если мы напишем 0 без кавычек, то это тип данных number и при переводе в буль он равен значению false. Проверим:
console.log(typeof(0)); console.log(typeof(‘0’)); console.log(Boolean(0)); console.log(Boolean(‘0’));
«number» «string» false true
Любые другие числа кроме 0 определятся как true.
Булевы значения можно преобразовать в числовой тип. Значению true соответствует 1, а false – 0:
console.log(Number(true)); console.log(Number(false));
При преобразовании булевых значений в тип «строка» мы увидим слова «true» и «false» в кавычках, что означает, что тип изменился, так как значения boolean пишутся без кавычек:
console.log(String(true)); console.log(String(false));
«true» «false»
Виды типизации
Типизация, в зависимости от языка программирования, может быть одновременно:
— сильной или слабой;
— динамической или статической.
Если говорят, что у языка сильная типизация, это значит, что он не позволяет сочетать разные типы данных и не в силах автоматически их преобразовывать. Например, не получится сложить строку с числом в Python.
Слабая типизация означает, что язык программирования выполняет автоматическое (неявное) преобразование типов, в зависимости от операции, которая над данными производится. Например, так происходит в JavaScript.
Чем более сильная типизация у языка, на котором написан код, тем более надежной считается программа. Поскольку именно такая типизация защищает программиста от простых ошибок, которые трудно обнаружить: опечатки, введение данных неподходящего типа.
В языках с динамической типизацией тип данных не фиксируется и может быть разным у одних и тех же данных в разных частях кода.
А в статической типизации тип фиксируется при первом объявлении значений. Изменить это у нас не получится. Ошибка в типе обнаружится еще до запуска программы.
Домашнее задание
Напишите типы данных двух разных языков программирования. Укажите, с какой они типизацией. Например, JavaScript – язык со слабой и динамической типизацией.
Опишите, с помощью каких команд в выбранных языках можно преобразовать друг в друга три базовых типа данных: целое число, строка и булевы значения.
Источник: loftschool.com
Короче, типы данных в программировании
В одной из предыдущих статей я поделился общей информацией про динамическую и строгую типизацию ( ссылка ). А сегодня, мы поговорим уже более конкретно, про сами типы данных в программировании. В целом, типизация информации — это один из базовых принципов упорядочивания программного кода. Её использование с одной стороны позволяет упростить написание кода, с другой стороны сделать его понятным для других участников проекта, и в-третьих ускорить его выполнение компьютером.
То есть, типизация решает сразу несколько проблем. Но в общем и целом, как и другие принципы программирования, она нужна для упрощения разработки. Важно понимать и уметь применять типизацию, поскольку типы данных так же важны для программ, как и знание алфавита в разговорной речи.
Что такое тип данных, зачем он нужен?
Тип данных — это информация о том, какого вида данные мы будем хранить в некоторой ячейке памяти. Типизация — это указание типа данных перед названием объявляемой переменной.
Повторяя прошлые статьи вкратце, переменные это контейнеры для хранения информации в программе. И если сама переменная представляет из себя область физической памяти (условную коробку), в которой будет записана информация, то тип данных можно считать «наклейкой с надписью» на этой коробке.
Когда мы наводим дома порядок, и раскладываем вещи по коробкам, то одну коробку подписываем «документы», другую «детские вещи», третью «фотографии» и так далее. В этом случае, «документы», «детские вещи» и «фотографии» будут типами данных. А коробки — переменными, в которых будет храниться заявленное содержимое.
Важность типизации сложно переоценить. Представьте что у Вас есть склад, на котором хранятся товары. Согласитесь, есть очень большая разница в одной маленькой детали — будут ли подписаны коробки на складе. Если они БУДУТ подписаны, то для поиска нужной коробки Вам просто нужно пару раз прогуляться туда-сюда, и почитать надписи на коробках.
Если они НЕ БУДУТ подписаны, то для поиска нужной коробки Вам придётся сделать полную ревизию склада, открыв и заглянув в каждую из коробок. Абсолютно то же самое происходит в программировании. Когда программа подробно типизована, она понятна, и над ней могут работать несколько программистов. Когда программа не типизована, её разработка превращается в буквальный челлендж для каждого программиста.
Можно привести и другой пример типизации, который хорошо перекликается с жизнью. На сегодняшний день, существует несколько стандартов кабелей к мобильным телефонам. MicroUSB, lighting, nanousb и другие. Одни кабели подходят для iPhone, а другие для Samsung. И если попытаться засунуть кабель от Samsung в iPhone, это вряд-ли получится. Вот точно так же работают и типы данных.
Есть условный тип данных «iPhone», и в него подходит только зарядка от «iPhone». Точно так же и в программировании. Есть условный тип данных «число», куда подходят только числа. А есть тип данных «строка», который подходит только для текста.
Как объявить тип данных у переменной?
Тип данных в большинстве языков программирования указывается перед названием переменной. То есть, вот так: ТИП_ДАННЫХ НАЗВАНИЕ_ПЕРЕМЕННОЙ ОСТАЛЬНОЙ_КОД. Для указания типа используются специальные слова, определяющие этот тип: int, double, string и так далее.
Вот простейший пример объявления переменной строкового типа: string MyString; А вот так можно объявить числовую переменную, подходящую для чисел без дробей: int MyNumber; И кстати, при создании переменной можно сразу записать туда некоторое значение: int MyNumberTwo = 28; И вот примеры небольшим списком:
- int a = 10;
- int b;
- string Q = «hello»;
- string FFF = «»;
- double TTT = 108.6;
- bool IsCompleted = true;
Какие типы данных существуют?
Условно, существует ограниченный набор универсальных типов данных. Он может незначительно меняться, в зависимости от языка или программной платформы. Где-то типов чуть больше, где-то чуть меньше. Это зависит от класса задач, которую решает среда разработки.
- string / text / varchar — строковый тип. Используется для хранения текста
- number — числовой тип (для любых чисел)
- char — символьный тип (одиночные буквы)
- boolean — булев тип (Да / Нет = True / False)
- Int / integer — целочисленный тип (целые числа без точки)
- double / float — дробные числа (числа с точкой)
- decimal — дробные очень большие числа (числа с точкой)
- datetime / date / time — дата и время, просто дата или просто время.
- object — объектный тип, нужен для хранения экземпляров классов
Повторюсь, в зависимости от языка и платформы, количество типов и их названия могут несколько отличаться. Как правило, в базах данных типов чуть больше, в языках — чуть меньше. Языки для веб-программирования в целом склонны к упрощению типизации, в то время как языки для системного программирования склонны к усложнению типизации. Но в целом, в этом очень просто разобраться.
Строгая типизация — хороший стиль организации программ
Старайтесь использовать типизацию везде, где это только возможно. Это хороший стиль программирования. Даже если среда или язык предлагают Вам опционально использовать динамическую (нестрогую типизацию) — не ведитесь на эту историю 🙂
Качественные программы отличаются структурированностью и простотой. И один из базовых принципов структурированности, это явное объявление типов для каждой используемой переменной.
Источник: dzen.ru