Типы данных для хранения вещественных чисел сообщение

Обновлено: 02.07.2024

Вещественные числа в памяти компьютера представляются в форме с плавающей точкой.

Форма с плавающей точкой использует представление вещественного числа R в виде произведения мантиссы m на основание системы счисления р в некоторой целой степени n, которую называют порядком:

Однако справедливы и следующие равенства:

25,324 = 2,5324*(10^1) = 0,0025324*(10^4) = 0,25324*(10^2) и т.п. Получается, что представление числа в форме с плавающей точкой неоднозначно? Чтобы не было неоднозначности, в ЭВМ используют нормализованное представление числа в форме с плавающей точкой. Мантисса в нормализован-ном представлении должна удовлетворять условию:

Гост

ГОСТ

В $1976$ году была появилась инициатива создать единый стандарт для представления чисел с плавающей запятой, что существенно упростило работу с числами.

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

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

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

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

Нормализованная запись числа

является нормализованной записью отличного от нуля действительного числа,

где $n$ -- любое целое число (в том числе и ноль),

$m$ -- правильная дробь в системе счисления с основой $q$, у которой первая цифра после запятой не равна нулю, то есть $\frac\le m

$m$ называется мантиссой числа, $n$ -- порядком числа, $q$ -- основанием системы счисления.

Приведем числа десятеричной системы к нормализованной записи:

\[1.3579=0.13579\cdot ^1;\] \[10000=0.1\cdot ^5;\] \[0,123456=0.123456\cdot ^0.\]

Приведем число восьмеричной системы счисления к нормализованной записи:

$_8=_8\cdot 8^$ (порядок записан в десятичной системе).

Приведем число двоичной системы счисления к нормализованной записи:

Готовые работы на аналогичную тему

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

Нормализованная экспоненциальная запись (НЭЗ) числа - это запись в виде

где $n$ -- любое целое число (в том числе и ноль),

$m$ -- правильная дробь в системе счисления с основой $q$, целая часть которой состоит из одной цифры,

$m$ --мантисса числа, а $n$ -- порядок (или экспонента) числа.

Рассмотрим вышеописанные числа в нормализованной экспоненциальной записи.

НЭЗ десятичных чисел:

\[1.3579=0.13579\cdot ^1=1.3579\cdot ^0;\] \[10000=0.1\cdot ^5=1.0\cdot ^4;\] \[0.123456=0.123456\cdot ^0=1.23456\cdot ^.\]

НЭЗ восьмеричного числа:

НЭЗ двоичного числа:

Обратите внимание, что в НЭЗ записи первая цифра после запятой может быть нулём, в отличие от нормализованной записи.

Хранение чисел с плавающей запятой

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

Если для задания порядка выделено k разрядов, то к истинному порядку (ИП) прибавляют смещение, таким образом, смещённый порядок (СП) рассчитывается по формуле:

Найдем смещённый порядок для истинного порядка, лежащего в диапазоне от $-127$ до $+128$.

Возьмем начальное значение ИП= $-127$:

Возьмем конечное значение ИП = $128$:

Таким образом, ИП, лежащий в диапазоне от $-127$ до $+128$, представляется смещённым порядком, значения которого меняются в диапазоне от $0$ до $255$.

Алгоритм представления вещественного числа:

Перевести число в двоичную систему счисления.

Привести число к нормализованной записи.

Найти смещённый порядок числа.

Поместить знак, порядок и мантиссу в соответствующие разряды.

Представим число $-25.625$ в $4$-байтовом представлении ($1$ бит отводится под знак числа, $8$ бит -- под смещённый порядок, остальные биты -- под мантиссу).

Аннотация: В лекции рассматриваются понятие типов данных в языках программирования, приводится классификация типов данных в С++, излагаются особенности представления базовых типов и операций над ними, рекомендации и правила выполнения операции преобразования базовых типов в С++.

Цель лекции: изучить классификацию типов и их внутреннее представление в языке С++, научиться работать со стандартными и пользовательскими типами .

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

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

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

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

  • внутреннее представление данных в памяти компьютера;
  • объем памяти, выделяемый под данные;
  • множество (диапазон) значений, которые могут принимать величины этого типа;
  • операции и функции, которые можно применять к данным этого типа.

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

Классификация типов данных в С++

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

Объектно-ориентированные языки программирования позволяют определять типы класса.

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

Тип данных определяет размер памяти, выделяемой под переменную данного типа при ее создании. Язык программирования C++ поддерживает следующие типы данных (рис. 1.1).

  • Базовые типы. Базовые типы предопределены стандартом языка , указываются зарезервированными ключевыми словами и характеризуются одним значением. Их не надо определять и их нельзя разложить на более простые составляющие без потери сущности данных. Базовые типы объектов создают основу для построения более сложных типов .
  • Производные типы. Производные типы задаются пользователем, и переменные этих типов создаются как с использованием базовых типов, так и типов классов.
  • Типы класса. Экземпляры этих типов называются объектами.

Существует четыре спецификатора типа данных, уточняющих внутреннее представление и диапазон базовых типов:

Рассмотрим более подробно базовые типы данных .

Целочисленный (целый) тип данных (тип int)

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

Границы диапазона целых чисел, которые можно хранить в переменных типа int , зависят от конкретного компьютера, компилятора и операционной системы (от реализации). Для 16-разрядного процессора под него отводится 2 байта, для 32-разрядного – 4 байта.

Для внутреннего представления знаковых целых чисел характерно определение знака по старшему биту (0 – для положительных, 1 – для отрицательных). Поэтому число 0 во внутреннем представлении относится к положительным значениям. Следовательно, наблюдается асимметрия границ целых промежутков.

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

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

  • short int – занимает 2 байта, следовательно, имеет диапазон от –32 768 до +32 767;
  • int – занимает 4 байта, следовательно, имеет диапазон от –2 147 483 648 до +2 147 483 647;
  • long int – занимает 4 байта, следовательно, имеет диапазон от –2 147 483 648 до +2 147 483 647;
  • long long int – занимает 8 байтов, следовательно, имеет диапазон от –9 223 372 036 854 775 808 до +9 223 372 036 854 775 807.

Модификаторы signed и unsigned также влияют на множество допустимых значений, которые может принимать объект :

  • unsigned short int – занимает 2 байта, следовательно, имеет диапазон от 0 до 65 535;
  • unsigned int – занимает 4 байта, следовательно, имеет диапазон от 0 до 4 294 967 295;
  • unsigned long int – занимает 4 байта, следовательно, имеет диапазон от 0 до 4 294 967 295;
  • unsigned long long int – занимает 8 байтов, следовательно, имеет диапазон от 0 до 18 446 744 073 709 551 615.

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

  • Нельзя пользоваться десятичной точкой. Значения 26 и 26.0 одинаковы, но 26.0 не является значением типа int .
  • Нельзя пользоваться запятыми в качестве разделителей тысяч. Например, число 23,897 следует записывать как 23897.
  • Целые значения не должны начинаться с незначащего нуля. Он применяется для обозначения восьмеричных или шестнадцатеричных чисел, так что компилятор будет рассматривать значение 011 как число 9 в восьмеричной системе счисления .

На практике рекомендуется использовать основной целый тип , то есть тип int . Данные основного целого типа практически всегда обрабатываются быстрее, чем данные других целых типов. Короткий тип short подойдет для хранения больших массивов чисел с целью экономии памяти при условии, что значения элементов не выходят за предельные границы для этих типов. Длинные типы необходимы в ситуации, когда не достаточно типа int .

Вещественный (данные с плавающей точкой) тип данных (типы float и double)

Для хранения вещественных чисел применяются типы данных float (с одинарной точностью) и double (с двойной точностью). Смысл знаков "+" и "-" для вещественных типов совпадает с целыми. Последние незначащие нули справа от десятичной точки игнорируются. Поэтому варианты записи +523.5, 523.5 и 523.500 представляют одно и то же значение .

Для представления вещественных чисел используются два формата:

В большинстве случаев используется тип double , он обеспечивает более высокую точность , чем тип float . Максимальную точность и наибольший диапазон чисел достигается с помощью типа long double .

Величина с модификатором типа float занимает 4 байта. Из них 1 бит отводится для знака, 8 бит для избыточной экспоненты и 23 бита для мантиссы . Отметим, что старший бит мантиссы всегда равен 1, поэтому он не заполняется, в связи с этим диапазон модулей значений переменной с плавающей точкой приблизительно равен от 3.14E–38 до 3.14E+38.

Величина типа double занимает 8 байтов в памяти. Ее формат аналогичен формату float . Биты памяти распределяются следующим образом: 1 бит для знака, 11 бит для экспоненты и 52 бита для мантиссы . С учетом опущенного старшего бита мантиссы диапазон модулей значений переменной с двойной точностью равен от 1.7E–308 до 1.7E+308.

Andrew Fionik
дата публикации 09-04-2004 15:57

урок из цикла: Азы Delphi.

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

Pascal, Object Pascal а за ними и Delphi всегда являлись строго типизированными языками, а это очень важное и полезное свойство языка. Когда для переменных определен тип данных к которому они принадлежат, компилятор имеет возможность проверить правильность операций производимых над этими переменными на этапе компиляции. Таким образом, компилятором производится как-бы первичное тестирование вашего кода. Однако, будучи языком строго типизированным, Delphi имеет механизмы позволяющие программисту определить "свои правила игры" и проинструктировать компилятор чтобы тот трактовал переменные не так, как положено их трактовать согласно их типу, а так, как указывает программист. Такой подход чем-то напоминает электрическую мясорубку. Запихивайте туда мясо согласно инструкции и она благополучно выплюнет фарш из которого ваша мамочка, жена или подруга нажарит вкуснючих котлет. Но если снимете предохранительный кожух и неловко дернетесь, то фарш будет из ваших пальцев.

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

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

NB! Целочисленные типы данных наиболее примитивные и наиболее быстро и легко обрабатываемые процессором. Всегда, если вам нужно обрабатывать численную информацию, старайтесь хранить ее и обрабатывать в целочисленном виде.

Вся масса целочисленных типов разделяется на две части - знаковые и беззнаковые типы данных. Знаковые типы данных позволяют хранить значения со знаком, точнее со знаком "-", т.е. отрицательные значения. Беззнаковые типы данных всегда хранят только значения больше или равно нулю.

Общие целочисленные типы

Integer

Тип данных Integer общий (generic) знаковый тип. Если помните предыдущую лекцию, то там объяснялось что общие типы данных - платформозависимые. Так вот и Integer на разных платформах имеет разный диапазон значений и занимает разный объем памяти, соответствующий одному машинному слову. На 32-ух разрядных системах Integer может содержать содержать значения от -2147483648 до 2147483647. Почему именно такой диапазон? Все очень просто, это минимальное и максимальные значения которые можно выразить (закодировать) 32-мя бинарными разрядами.Далее, когда снова попадется общий тип данных, я буду указывать его параметры именно для 32-ух разрядных систем. Какими они были на старых системах не очень-то и интересно, а какими они будут сами догадаетесь, не маленькие уже.

Cardinal

Общий (чуете что это значит?) беззнаковый тип. Может содержать значения от 0 до 4294967295.

Фундаментальные целочисленные типы

У прочих встроенных типов данных нет каких-либо особенностей, поэтому ниже я дам просто сводную таблицу в которой будут описаны эти типы данных.

Сводная таблица типов

  • Хранение целочисленных значений.
  • Различные математические вычисления.

Вещественные типы данных

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

NB! Тут следует обратить внимание на некоторые расхождения в терминологии. У нас считается что дробную часть от целой разделяет запятая. У "них" (америкосов) - точка. Соответственно по отношению к вещественным типам данных говорится floating point (плавающая точка) и fixed point (фиксированная точка). В частности в Delphi, для записи вещественных значений в тексте программы, используется именно точка а не запятая. Однако, внутренний формат записи вещественных чисел никак не относится к их представлению пред ясны очи пользователя у которого согласно давней доброй традиции целая часть от десятичной в его родной зимбабве может отделяться буквой "зю".

Для вещественных чисел с плавающей точкой данные хранятся в экспоненциальном формате. Т.е. хранятся мантисса и экспонента (не помню уже преподают это в школе или нет, но на всякий случай объясню). Например число 12345.6789 хранится в виде 1.23456789*10^4 (1.23456789 умножить на десять в степени 4). Мантисса это число 1.23456789 а экспонента это 4, то в какую степень возводится 10.
Вы спросите: "Что за тавтология!? Опять-же записываем десятичную дробь с помощью десятичной точки. Та же фигня только в профиль".
Отвечаю: "А компьютер про десятичную точку на самом деле ничего не знает, он просто хранит у себя 123456789 и 4 (упакованные конечно в бинарную форму, в один блок памяти фиксированного размера). И всегда считается что десятичная точка находится после первой цифры - в нашем случае между 1 и 2".

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

Пример. Пусть количество значащих цифр 7. Тогда записывая число 987654321 мы сможем записать только 7 цифр из этого числа для представления его в компьютере. Таким образом записать наше число сможем только в приблизительном виде: 9.876543E+8. Все последующие операции с этим значением будут выполнятся уже как с 987654300 а не как с 987654321. Попробуем прибавить к такому числу 1 и получим не 987654322 и не 987654301 а все то-же 987654300 т.к. результат все равно не может быть выражен таким ограниченным количеством значащих цифр.

Второе следствие такого способа хранения вещественных значений - особенности совместного хранения таких значений. Предположим что у нас есть два типа данных, один из которых позволяет хранить 7 значащих цифр а второй 12. Присвоим переменным этих типов значение 123456789. Значение одной переменной будет 1.234567E8 а второй 1.23456789E8. Т.е. получается что значения в этих переменных уже не равны, хотя мы и присваивали им одно и то-же значение.

Ну и третье следствие хранения вещественных значений - сравнение таких значений. Предположим что двумя разными путями вычислялась одна и та-же величина. В одном случае получился результат 1.234 в другом 1.235. Равны ли эти результаты? Вы скажете "нет" и будете правы. Скажете "да" и будете тоже правы. Вопрос состоит в том какая "степень равенства" нас удовлетворяет чтобы признать эти числа равными. Для определения равенства двух вещественных значений обычно используется не собственно результат их сравнения, а соотношение между их разностью и Epsilon - неким достаточно маленьким числом. Т.е. считается что два числа равны если модуль их разности не превышает Epsilon который мы задаем изначально и значение которого мы признаем достаточным чтобы обеспечить приемлемую точность наших расчетов.

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

Четвертая особенность хранения вещественных значений - не все, казалось бы простые значения, могут быть помещены в вещественные переменные в точности в том же виде в котором они фигурировали в тексте программы. Не смотря на то что и значащих цифр хватает, и число попадает в допустимый диапазон. Например попробуем поместить число 0.3 в переменную типа Real. В процедуре WriteLn числа 21 и 20 указывают формат вывода заставляя печатать значение переменной A используя минимум 21 знак из которых 20 знаков после десятичной запятой. Вы удивитесь, но будет выведено не 0.300000. а 0.29999999999999999000. Очень близко к 0.3 но не 0.3. Т.е. число 0.3 (как и многие другие числа) на самом деле не удается представить точно в двоичной форме. Вы можете использовать значение переменной A в вычислениях, даже не замечая того что она содержит не 0.3, и ошибка вычислений будет минимальна. Если вы попытаетесь вывести пользователю значение переменной A, то пользователь скорее всего увидит именно 0.3 т.к. большинство методов с помощью которых выводится числовая информация для пользователя так или иначе при выводе делает округление до определенного количества цифр. Если вы попытаетесь сравнить это число с другим "по правильному", т.е. так, как описано в третьем следствии, то вы получите верный результат т.к. скорее всего ваш Epsilon будет что-то около 0.001 или 0.000001. Это значительно больше расхождения между числом 0.3 и его представлением в переменной типа Real которое мы наблюдаем. Казалось бы со всех сторон мы прикрыты, но помнить об этой особенности надо.

Намного более подробное объяснение всех этих тонкостей можно прочитать в статье: Неочевидные особенности вещественных чисел написанной Антоном Григорьевым.

Сводная таблица вещественных типов

ТипДиапазон значенийФорматЗначащих цифрПрочее
Real5e-324..1.7e308знаковый, 8 байт15..16общий
Real482.9e-39..1.7e38знаковый, 6 байт11..12фундаментальный
Single1.5e-45..3.4e38знаковый, 4 байт7..8фундаментальный
Double5e-324..1.7e308знаковый, 8 байт15..16фундаментальный, фактически эквивалентен Real
Extended3.6e-4951..1.1e4932знаковый, 10 байт19..20фундаментальный
Comp-2^63+1..2^63-1знаковый, 8 байт19..20фундаментальный
Currency-922337203685477.5808..922337203685477.5807знаковый, 8 байт19..20фундаментальный, с фиксированной точкой

Примечания по поводу разных типов данных

Real48

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

Extended

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

Примечание:
Честно говоря эту фразу я сдул прямо из борладновского хелпа, слабо понимая что она значит и почему все именно так а не иначе. :-)

Устаревший тип данных. В действительности хранится как 64-ех битное целое число, однако трактуется как вещественное т.к. к нему неприменимы операции которые обычно могут быть выполнены над целыми числами. Например получение следующего или предыдущего значений. Вместо него где только возможно нужно использовать Int64.

Currency

Фиксированная десятичная точка. В действительности хранится как 64-ех разрядное целое число с четырьмя наименее значимыми цифрами неявно считающимися дробной частью. Используется для выражения денежных величин. Финансовые вычисления с точностью до 4-ех знаков после десятичной точки - общепринятая мировая практика позволяющая снизить ошибки при расчетах.

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

Из всего этого словоизвержения про мантиссы, экспоненты, количество значащих цифр, особенности типов вы должны были сделать вывод. А вывод такой: "Для математических вычислений следует выбирать типы данных согласуя характер расчетов с возможностями и особенностями имеющихся типов данных. Неверный выбор в конечном счете может существенно повлиять на результаты расчетовю. Если они у вас вообще будут."

Арифметические операции

  1. Сложение "+"
  2. Вычитание "-"
  3. Умножение "*"
  4. Деление "/"
  5. Деление нацело "div"
  6. Остаток от деления нацело "mod"
  • 4+5 - сложение двух констант 4 и 5
  • A*9/C - значение в переменной (или константе) по имени A умножить на девять и результат разделить на значение находящееся в переменной (или константе) по имени C.
  • Z div 10+1 - разделить значение Z на десять нацело и прибавить к результату 1

Приоритет операций

  • Порядок вычисления для операций с равным приоритетом - слева направо.
  • Умножение и деление имеют равный но больший приоритет (вычисляются раньше) чем сложение и вычитание, которые в свою очередь имеют тоже равный приоритет. Приоритет деления нацело и взятия остатка от деления равны приоритету умножения и вычитания.
  • При необходимости приоритет может быть изменен с помощью расстановки круглых скобок.
  • A+B-C/6*25 выполняется в следующей последовательности A+B, C/6, C/6*25, A+B-C/6*25.
  • (A+(B-C)/6)*25 Тут последовательность была изменена скобками: B-C, (B-C)/6, A+(B-C)/6, (A+(B-C)/6)*25.

Оператор присваивания

Хотя оператор присваивания переменной какого-нибудь значения имеет достаточно широкий смысл, однако в случае математики оператор присваивания позволяет сохранять результаты вычислений внутри переменных. Формат оператора присваивания: . где Переменная - идентификатор объявленной переменной а Выражение одно из вышеупомянутых математических выражений.

  • B:=A/Z; - переменной B присваивается результат деления значения переменной A на значение переменной Z.
  • D:=(A+(B-C)/6)*25; - переменной D присваивается результат вычисления выражения (A+(B-C)/6)*25.

Примечание:
Была у меня когда-то японская книжка, автор которой исходил из главной идеи что программированию будут учиться полные дауны. Там вся эта математика разжевывалась так что не понять было невозможно. Со схемами и сценками из жизни японцев. Жаль не сохранилась, мне очень помогла. :-)

Совместимость типов данных

Рассмотрим простейший пример программы в котором проявляется проблема совместимости типов данных. Что мы здесь видим? Во первых, вещественной переменной B присваивается целочисленное значение 47 являющееся результатом сложения двух целочисленных констант 15 и 32. Т.е. здесь мы можем наблюдать неявное преобразование типа выражения 15+32 из целочисленного в вещественный, так чтобы вещественное значение 47.0 можно было разместить в вещественной переменной B. Во вторых, мы наблюдаем попытку присвоить целочисленной переменной A вещественный результат вычисления выражения B/3. Если первый оператор присваивания не вызовет возражений со стороны компилятора, то на второй оператор будет выдана ошибка компиляции.

Рассмотрим второй пример программы. Здесь мы наблюдаем попытку присвоения переменной B значения которое выходит за допустимый диапазон значений для типа данных Real. Этот код так-же вызовет ошибку.

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

  • A+5 - тип результата Integer
  • A+B - тип результата Real
  • A+B*C - тип результата Extended
  • B/A - тут казалось бы достаточно типа Real, но в действительности для Delphi тип результата деления Extended всегда

В случае с присвоением результатов значений надо заметить что вещественные и целочисленные типы данных неявно совместимы внутри самих себя. Попытка присвоить переменной типа Byte значение переменной типа Integer будет синтаксически верной, т.е. не вызовет ошибки компиляции. Ведь может быть в переменной типа Integer лежит значение 5, которое вполне подходит как для Byte так и для Integer. Однако в этом случае компилятор вставляет машинный код который контролирует значение присваиваемое переменной типа Byte. Если это окажется значение не попадающее в диапазон 0..255, (диапазон допустимых значений для Byte) то во время выполнения программы случится ошибка. То-же самое относится и к вещественным типам данных.


Смотрите также материалы по темам: [Типы данных]

Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
Функция может не работать в некоторых версиях броузеров.

Читайте также: