Типы-обертки детально

Символьный тип

Значениями символьного типа являются символы, которые можно набрать на клавиатуре компьютера. Это позволяет представить в программе текст и производить над ним различные операции: вставлять, удалять отдельные буквы и слова, форматировать и т.д.


Символьный тип обозначается зарезервированным словом Char и предназначен для хранения одного символа. Данные символьного типа в памяти занимают один байт.

Формат объявления символьной переменной:

 <имя переменной>: Char; 

При определении значения символьной переменной символ записывается в апострофах. Кроме того, задать требуемый символ можно указанием непосредственно его числового значения ASCII-кода. В этом случае необходимо перед числом, обозначающим код ASCII необходимого символа, поставить знак #.

Пример использования переменных символьного типа:

Var
c:char; {c – переменная символьного типа}
Begin
c:=’A’; {переменной c присваивается символ ’A’}
c:=#65; {переменной c также присваивается символ A. Его ASCII код равен 65}
c:=’5’; {переменной c присваивается символ 5,
End. здесь 5 это уже не число}

§ 1.3. Переменная: тип, имя, значение

Содержание урока

1.3. Переменные: тип, имя, значение

1.3. Переменные: тип, имя, значение

В языках Visual Basic и Gambas и в языке OpenOffice.org Basic переменные используются для хранения и обработки данных в программах.

Переменная задается именем, определяющим область оперативной памяти компьютера, в которых хранится значение переменной. Значениями переменных могут быть данные различных типов (целые или вещественные числа, последовательности символов, логические значения и т. д.).

Переменная в программе представлена именем и служит для обращения к данным определенного типа, конкретное значение которых хранится в ячейке оперативной памяти.

Тип переменной. Тип переменной определяется типом данных, которые могут быть значениями переменной. Значениями переменных числовых типов Byte, Short, Integer, Long, Single, Double являются числа, логического типа Boolean — значения «истина» (True) или «ложь» (False), строкового типа String — последовательности символов. Обозначения типов переменных являются ключевыми словами языка и поэтому выделяются.

Данные различных типов требуют для своего хранения в оперативной памяти компьютера различное количество ячеек (байтов) (табл. 1.3).

Таблица 1.3. Типы переменных

Имя переменной. Имя переменной определяет область оперативной памяти компьютера, в которых хранится значение переменных. Имя каждой переменной (идентификатор) уникально и не может меняться в процессе выполнения программы. В рассматриваемых языках имя переменной может состоять из различных символов (латинские и русские буквы, цифры и т. д.), но должно обязательно начинаться с буквы и не должно включать знак точка «.». Количество символов в имени не может быть более 1023, однако для удобства обычно ограничиваются несколькими символами.

Объявление переменных. Необходимо объявлять переменные, для того чтобы исполнитель программы (компьютер) «понимал», переменные какого типа используются в программе.

Для объявления переменной используется оператор объявления переменных Dim. С помощью одного оператора можно объявить сразу несколько переменных, например:

Dim A As Byte, В As Short, С As Single, D As String, E As Boolean

Присваивание переменным значений. Задать или изменить значение переменной можно с помощью оператора присваивания. При выполнении оператора присваивания переменная, имя которой указано слева от знака равенства, получает значение, которое находится справа от знака равенства. Например:А = 255 В = -32768 С = 3.14 D = «информатика» Е = True

Значение переменной может быть задано числом, строкой или логическим значением, а также может быть представлено с помощью арифметического, строкового или логического выражения.

Проанализируем процесс выполнения программы компьютером (для определенности записанной на языке Visual Basic). После запуска проекта оператор объявления переменных Dim отведет в оперативной памяти для их хранения необходимое количество ячеек (табл. 1.4):• для целой неотрицательной переменной А одну ячейку; • для целочисленной переменной В две ячейки; • для переменной одинарной точности С четыре ячейки; • для строковой переменной D по две ячейки на символ; • для логической переменной Е две ячейки.

Таблица 1.4. Значения переменных в оперативной памяти

Таким образом, в памяти для хранения значений переменных будет отведена 31 ячейка, например ячейки с 1-й по 31-ю.

Контрольные вопросы

1. В чем состоит разница между типом, именем и значением переменной?

2. Какие основные типы переменных используются в языке программирования Visual Basic? Gambas? OpenOffice.org Basic?

3. Почему рекомендуется объявлять переменные перед их использованием в программе?

Задания для самостоятельного выполнения

1.5. Задание с кратким ответом. Назовите количество ячеек оперативной памяти, необходимое для хранения значений переменных первых семи типов языка OpenOffice.org Basic, перечисленных в табл. 1.3.

Cкачать материалы урока

Числовые типы

Хранение целых чисел

  • TINYINT(N) (синоним INTEGER, BOOL, BOOLEAN) — 8 бит;
  • SMALLINT(N) — 16 бит;
  • MEDIUMINT(N) — 24 бита;
  • INT(N) — 32 бита;
  • BIGINT(N) — 64 бита.

СУБД MySQL позволяет указывать для целых чисел «размер», например INT(11). Для большинства приложений это не имеет значения: диапазон возможных значений этим не ограничивается. Однако данный параметр говорит некоторым интерактивным инструментам MySQL, сколько позиций необходимо зарезервировать для вывода числа. С точки зрения хранения и вычисления INT(1) и INT(20) идентичны.

Целочисленный тип данных длиной N бит позволяет хранить значения от -2(N-1) до 2(N-1)-1.

Целые типы данных могут иметь необязательный атрибут UNSIGNED, запрещающий отрицательные значения и приблизительно вдвое увеличивающий верхний предел положительных значений. Например, тип TINYINT UNSIGNED позволяет хранить значения от 0 до 255, а не от -128 до 127.

Знаковые и беззнаковые типы требуют одинакового пространства и обладают одинаковой производительностью.

Необязательный атрибут ZEROFILL заполнит нулями свободные позиции слева. Например с TINYINT(3) ZEROFILL, величина 2 будет записана, как 002.

Тип данных Бит По умолчанию UNSIGNED
TINYINT 8 -128 — 127 0 — 255
SMALLINT 16 -32768 — 32767 0 — 65535
MEDIUMINT  24 -8388608 — 8388607 0 — 16777215
INT  32 -2147483648 — 2147483647 0 — 4294967295
BIGINT  64 -9223372036854775808 — 9223372036854775807 0 — 18446744073709551615

Хранение дробных чисел

Все типы допускают приближенные математические вычисления с плавающей точкой, но в случае с FLOAT и DOUBLE операции выполняются быстрее, так как процессор выполняет их естественным для него образом.

  • FLOAT(M,D) — число с плавающей точкой небольшой точности, задействует 4 байта. 
  • DOUBLE(M,D) (синонимы REAL, DOUBLE PRECISION) — число с плавающей точкой двойной точности. Задействует 8 байт, имеет большую точность и больший диапазон значений. 
  • DECIMAL(M,D) (синонимы DEC, NUMERIC, FIXED) — дробное число, хранящееся в виде строки, если десятичное значение равно 0, значение не будет иметь десятичной запятой или дробной части. Предназначен для хранения точных дробных чисел (можно хранить большие целые числа, не помещающиеся в типе BIGINT). Имеет смысл использовать только тогда, когда нужны точные результаты при вычислениях с дробными числами, — например, при хранении финансовых данных. Задействует больше пространства. 

M — количество отводимых под число символов. D — количество символов дробной части. 

Для типов с плавающей точкой можно указать максимально разрешенное количество цифр до и после десятичной запятой. В случае с DECIMAL это влияет на объем пространства, требуемого для хранения данных столбца. При указании точности, в некоторых случаях, MySQL незаметно для пользователя может выбирать другой тип данных или будет округлять значения при сохранении. Поэтому рекомендуют указывать желаемый тип, но не точность.

FLOAT и DOUBLE могут иметь параметр UNSIGNED, запрещающий отрицательные числа, но диапазон значений от этого не изменится. 


Число типа DECIMAL в MySQL 5.0 и более новых версиях может содержать до 65 цифр. В более ранних версиях MySQL тип DECIMAL имел предел 254 цифры и хранил значения в виде неупакованных строк (один байт на цифру). Однако эти версии СУБД не умели использовать такие большие числа в вычислениях, поскольку тип DECIMAL был просто форматом хранения. При выполнении каких-либо операций значения DECIMAL преобразовывались в тип DOUBLE.

Промежуточные вычисления с ограниченными целыми числами

Важно отметить, что хотя симулятор будет проверять диапазон значений, назначенных целому числу , эта проверка происходит только при фактическом присваивании значения, а не во время промежуточных вычислений. Чтобы прояснить это, рассмотрим следующий код:. Предположим, что и равны 45

В строке 9 первым будет определено. Таким образом, выражение внутри круглых скобок равно 90, что будет выходить за пределы диапазона, который может принимать. Тем не менее, это промежуточное вычисление, и поскольку присваивание пока не задействовано, симулятор не будет проверять диапазон результата. Затем выполняется вычитание, т.е. 90-1=89. Наконец, значение 89, которое находится теперь внутри заданного диапазона, будет присвоено. Ниже показана ISE симуляция для приведенного выше кода

Предположим, что и равны 45. В строке 9 первым будет определено . Таким образом, выражение внутри круглых скобок равно 90, что будет выходить за пределы диапазона, который может принимать . Тем не менее, это промежуточное вычисление, и поскольку присваивание пока не задействовано, симулятор не будет проверять диапазон результата. Затем выполняется вычитание, т.е. 90-1=89. Наконец, значение 89, которое находится теперь внутри заданного диапазона, будет присвоено . Ниже показана ISE симуляция для приведенного выше кода.

В принципе, промежуточные вычисления выполняются с использованием стандартного диапазона типа , т.е. 32 бита. Однако, поскольку это не будет оптимальной реализацией, программное обеспечение для синтеза будет выполнять некоторые оптимизации в зависимости от характера используемых операторов. Например, если промежуточная операция состоит в том, чтобы сложить два целых числа с диапазоном от 0 до 15, результат этого промежуточного вычисления будет иметь достаточное количество бит для представления наибольшего возможного значения, которое равно 30.

Целочисленный тип данных integer

Мы можем использовать тип данных для определения объектов, значение которых может быть целым числом. Например, следующие строки определяют сигнал типа и присваивают ему целое число 4.

Как показано на рисунке 2, тип данных относится к категории «стандартных типов», которая определена в пакете “” из библиотеки “”. Как обсуждалось в предыдущей статье, нам не нужно явно делать пакет “” и библиотеку “” видимыми для проекта.

Следующий код показывает простой пример, когда два входа типа , и , складываются вместе, и результат присваивается .

На рисунке 3 показан результат ISE симуляции приведенного выше кода. На этом рисунке показан десятичный эквивалент значений ввода/вывода. Например, от 200 нс до 300 нс, входы и равны 3 и -1 соответственно. Таким образом, выход, , равен 3 + (-1) = 2.

При использовании целочисленного типа данных мы не принимаем непосредственного участия в определениях на уровне битов, однако ясно, что реализация для представления определенных сигналов будет использовать несколько бит. Сколько бит будет использоваться для представления целочисленных сигналов в приведенном выше коде? VHDL не указывает точное количество бит, но любая реализация VHDL должна поддерживать как минимум 32-разрядрую реализацию типа . Согласно стандарту, эта 32-разрядная реализация позволяет присваивать объекту типа целое число в диапазоне от -(231-1) до +(231-1).

Иногда мы имеем дело с ограниченными значениями, и для представления небольшого значения неэффективно использовать 32-разрядный сигнал. Например, предположим, что вход принимает значение от до 45. Таким образом, мы можем использовать 6-разрядный сигнал вместо 32-разрядного представления, потому что 4510=1011012. Более того, предположим, что другой вход, , имеет значение в диапазоне от -45 до 45, поэтому должно использоваться знаковое () представление. Учитывая бит знака, нам нужно всего семь битов вместо 32 битов по умолчанию, потому что представление двух -45 равно 1010011. Чтобы добиться значительного сокращения использования ресурсов FPGA, мы можем просто указать диапазон значений сигналов, как в следующем коде:

Данный код предполагает, что входы и находятся в диапазонах от 0 до 45 и от -45 до 45 соответственно. Поскольку равен , диапазон будет от -45 до 90. Ограничение диапазона целых чисел уменьшает объем ресурсов FPGA, необходимых для реализации проекта. Более того, это дает возможность проверить на ошибки на ранних этапах проектирования. Например, предположим, что представляет собой угол, и из системных спецификаций мы знаем, что значение этого угла ограничено диапазоном от -45 до 90.

Как указано в приведенном выше коде, мы можем применить этот диапазон к определению объекта . Теперь, если мы допустим ошибку, которая заставляет значение находиться за пределами указанного диапазона, программное обеспечение симулятора выдаст ошибку и идентифицирует строку кода, которая включает недопустимое присваивание. Например, если мы укажем диапазон как от -45 до 89, а затем присвоим значение 45 и , и , ISIim симулятор прекратит моделирование со следующей ошибкой (ISim – это название симулятора, который включен в программное обеспечение ISE):

(В моем коде моделирования строка 17 содержит присваивание .) Обратите внимание, что симулятор ISIM по умолчанию не отлавливает эти ошибки, связанные с диапазоном; вы должны включить опцию «value range check» (проверка диапазона значений). Если данная опция не включена, симуляция не остановится, и целому числу, объявленному с ограниченным диапазоном, сможет быть присвоено любое значение

Обратите внимание, что указание меньшего диапазона не всегда означает, что мы можем представить сигнал меньшим количеством бит. Например, рассмотрите следующие объявления:. Первые для объявления требуют трехразрядного представления, хотя второе объявление имеет меньший диапазон

Аналогичным образом, третье и четвертое объявления должны иметь четыре бита

Первые для объявления требуют трехразрядного представления, хотя второе объявление имеет меньший диапазон. Аналогичным образом, третье и четвертое объявления должны иметь четыре бита.

Пользовательские типы

Из совокупности пользовательских типов рассмотрим только

  • перечисляемый тип;
  • интервальный тип.

Эти два типа нам будут необходимы при изучении массивов.

Перечисляемый тип

Перечисляемый тип данных описывает новые типы данных, значения которых определяет сам программист. Перечисляемый тип задается перечислением тех значений, которые он может получать. Каждое значение именуется некоторым идентификатором и располагается в списке, обрамленном круглыми скобками. Перечисляемый тип относится к типам данных, определяемым пользователем, поэтому объявление этого типа начинается зарезервированным словом TYPE .

Формат перечисляемого типа:

 Type 

 <имя типа>= (константа1, константа2,…, константаN); 

где константа1константа2,…, константаN – упорядоченный набор значений идентификаторов, рассматриваемых как константы.


Пример описания перечисляемого типа:

Type
ball=(one, two, three, four, five);
var
t:ball;

Здесь ball – имя перечисляемого типа; onetwothreefourfive – константы; t – переменная, которая может принимать любое значение констант.

В перечисляемом типе константа является идентификатором, поэтому она не заключается в кавычки и не может быть числом. Таким образом, в перечисляемом типе под константой понимается особый вид констант, которые не могут быть:

  • константами числового типа: 1, 2, 3, 4 и т. д;
  • константами символьного типа: ‘a’, ‘s’, ‘1’, ‘3’ и т. д.;
  • константами строкового типа: ‘first’, ‘second’ и т.д.

Кроме того, к значениям этого типа не применимы арифметические операции и стандартные процедуры ввода и вывода ReadWrite .

Пример использования переменных перечисляемого типа:

Type
days = (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday);
Var
day: days;
begin
if day = Sunday then writeln(‘Сегодня Воскресенье!’);
End.

Элементы, входящие в определение перечисляемого типа, считаются упорядоченными в той последовательности, в которой они перечисляются. Нумерация начинается с нуля. Поэтому в приведенном примере дни недели имеют следующие порядковые номера

Для программного определения порядкового номера используется функция Ord() .

В нашем примере порядковые номера равны:

 Ord(Monday) = 0; 

 Ord(Saturday) = 5; 

 Ord(Sunday) = 6. 

Интервальный тип

Если какая-то переменная принимает не все значения своего типа, а только значения, содержащиеся в некотором диапазоне, то такой тип данных называется интервальным типом. Часто интервальный тип называют ограниченным типом и типом-диапазоном. Интервальный тип задается границами своих значений:

 <минимальное значение>..<максимальное значение> 

Здесь:

  • два символа «..» рассматриваются как один символ, поэтому между ними недопустимы пробелы;
  • левая граница диапазона не должна превышать его правую границу.

Интервальный тип относится к типам данных, определяемых пользователем, поэтому объявление этого типа начинается со служебного слова TYPE .

Пример описания интервального типа:

 Type
digit = 1..10;
month = 1..31;
lat = ’A’..’Z’;

Целые типы

Данные этого типа могут принимать только значения целых чисел. В компьютере значения целого типа представляются абсолютно точно. Если переменная отрицательная, то перед ней должен стоять знак «–», если переменная положительная, то знак «+» можно опустить. Данный тип необходим в том случае, когда какую-то величину нельзя представить приближенно – вещественным числом. Например, число людей, животных и т.д.

Примеры записи значений целых чисел: 17, 0, 44789, -4, -127.

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

Тип Диапазон Размер в байтах
 Shortint   -128…+128   1 
 Integer   -32768…32767   2 
 Longint   -2147483648…2147483647   4 
 Byte   0…255   1 
 Word   0…65535   2 

Последние два типа служат для представления только положительных чисел, а первые три как положительных, так и отрицательных чисел.


В тексте программы или при вводе данных целого типа значения записываются без десятичной точки. Фактические значения переменной не должны превышать допустимых значений того типа ( ShortintIntegerLongintByteWord ), который был использован при описании переменной. Возможные превышения при вычислениях ни как не контролируются, что приведет к неверной работе программы.

Пример использования переменной целого типа

Var
a:integer;
b:word;
c:byte;
Begin
a:=300; {a присвоено значение 300}
b:=300; {b присвоено значение300}
c:=200; {c присвоено значение200}
a:=b+c; {a присвоено значение500}
c:=b; {Ошибка! Переменная c может принимать значения не более 255. Здесь переменной c присваивается значение 500,что вызовет переполнение результата.}
End.

Предупреждение насчет std::int8_t и std::uint8_t

По определенным причинам в C++ большинство компиляторов определяют и обрабатывают типы int8_t и uint8_t идентично типам char signed и char unsigned (соответственно), но это происходит далеко не во всех случаях. Следовательно, std::cin и std::cout могут работать не так, как вы ожидаете. Например:

#include <iostream> #include <cstdint> int main() { std::int8_t myint = 65; std::cout << myint << std::endl; return 0; }

1 2 3 4 5 6 7 8 9 10

#include <iostream> #include <cstdint>

intmain()

{

std::int8_t myint=65;

std::cout<<myint<<std::endl;

return;

}

На большинстве компьютеров с различными архитектурами результат выполнения этой программы следующий:

Т.е. программа, приведенная выше, обрабатывает как переменную типа char. Однако на некоторых компьютерах результат может быть следующим:

Поэтому идеальным вариантом будет избегать использования std::int8_t и std::uint8_t вообще (используйте вместо них std::int16_t или std::uint16_t). Однако, если вы всё же используете std::int8_t или std::uint8_t, то будьте осторожны с любой функцией, которая может интерпретировать std::int8_t или std::uint8_t как символьный тип, вместо целочисленного (например, с объектами std::cin и std::cout).

Правило: Избегайте использования std::int8_t и std::uint8_t. Если вы используете эти типы, то будьте внимательны, так как в некоторых случаях они могут быть обработаны как тип char.

Объявление переменных

В си переменные объявляются всегда в начале блока (блок — участок кода ,ограниченный фигурными скобками)

<возвращаемый тип> <имя функции> (<тип> <аргумент>) {
	объявление переменных

	всё остальное
}

При объявлении переменной пишется её тип и имя.

int a;
double parameter;

Можно объявить несколько переменных одного типа, разделив имена запятой

long long arg1, arg2, arg3;

Например

#include <stdio.h>
#include <conio.h>

int main() {
	int a = 10;
	int b;
	while (a>0){
		int z = a*a;
		b += z;
	}
}

Здесь объявлены переменные a и b внутри функции main, и переменная z внутри тела цикла. Следующий код вызовет ошибку компиляции

int main() {

	int i;
	i = 10;
	int j;
}

Это связано с тем, что объявление переменной стоит после оператора присваивания. При объявлении переменных можно их сразу инициализировать. int i = 0; При этом инициализация при объявлении переменной не считается за отдельный оператор, поэтому следующий код будет работать

int main() {

	int i = 10;
	int j;
}

2.2 Класс Double

Класс , в общем-то, аналогичен классу , только является оберткой не для типа , а для типа . У него тоже есть интересные нам поля и методы, рассмотрим некоторые из них:

Интересных полей у класса шесть:

Поле Описание
Минус бесконечность
Плюс бесконечность
Минимальное значение экспоненты (2x)
Максимальное значение экспоненты (2x)
Минимальное значение типа
Максимальное значение типа

Бесконечность

Если вы разделите на , получите отрицательную бесконечность, если на — положительную бесконечность. Тип может не только делить на ноль, но и хранить такие значения.

Экспонента числа

С экспонентой тоже все просто. Число double внутри состоит из мантисы и экспоненты. Только вот значение экспоненты — это не , а . Если экспонента вырастет на , итоговое значение числа станет больше в два раза.

, в итоге получаем примерно равно

Также у класса есть интересные методы:

Методы Описание
Возвращает строку — шестнадцатеричное представление числа
Проверяет, является ли переданное число бесконечностью.
Проверяет, является ли переданное число
Оборачивает переданный в
Возвращает число, полученное из строки

Из интересного можно отметить наличие метода , который возвращает , если переданное в него число было плюс или минус бесконечность.

Аналогично работает и метод — проверяет, является ли переданное в него число : специальная константа, обозначающая неопределенность (Not a Number, Не число).


С этим читают