Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Арифметическое переполнение

Представление знака числа

Целые типы

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

В Таблица 15.1 приведены характеристики целых типов языка программирования Object Pascal. Они различаются диапазоном допустимых значений и размером занимаемой памяти.

 

Таблица 15.1 - Целые типы

Название Диапазон значений Размер, байт
Byte 0...255  
ShortInt -128...+127  
SmallInt -32 768...+32 767  
Word 0...65 535  
Integer -2 147 483 648...+2 147 483 647  
LongInt -2 147 483 648...+2 147 483 647  
LongWord 0...4 294 967 295  
Int64 -9e18...+9e18  
Cardinal 0...2 147 483 647  

 

Примечание: Типы LongWord и Int64 впервые введены в Delphi версии 4, а типы SmallInt и Cardinal отсутствуют в Delphi 1. Тип Integer для Delphi 1 занимает 2 байта и имеет диапазон значений от -32768 до +32767, т.е. совпадает с SmallInt из Delphi 4.

 

Значения целых типов в программе могут изображаться в десятичном и шестнадцатеричном виде.

При действиях с целыми числами тип результата будет соответствовать типу операндов, а если операнды относятся к различным целым типам - общему типу, который включает в себя оба операнда. Например, при действиях с ShortInt и Word общим будет тип Integer.

 

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

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

Таким образом:

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

- унарный знак - (минус), поставленный перед параметром целого или вещественного типа, приводит к изменению знака величины.

 

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

 

  Беззнаковое Знаковое
    -7
    +2
    -5

 

Двоичное представление результата сложения одинаково для беззнакового и знакового числа. Однако биты представляют +251 для беззнакового числа и -5 для знакового. Таким образом, числовое содержимое поля может интерпретироваться по-разному.

 

Арифметическое переполнение (arithmetic overflow) - потеря значащих цифр при вычислении значения выражения.

Если в переменной можно хранить лишь неотрицательные значения (типы BYTE и WORD), то попытка записи в них отрицательного значения не вызовет ошибки. Возникнет арифметическое переполнение и в переменной окажется положительное значение, равное разности между максимально возможным числом комбинаций для этой переменной (256 или 65536 соответственно) и записываемым в нее отрицательным значением. Например, если в переменную a типа BYTE в результате вычислений записывается -20, то реально в ней окажется значение 256-20=236. Аналогичная ситуация возникает при записи слишком больших чисел – значение переменной проходит через ноль и начинает отсчет сначала. Так, при занесении значения 300 в переменную типа BYTE ее значением окажется 300-256=44.

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

 

procedure TfmExample.bbRunClick(Sender: TObject);

var

k:Word;

 

begin

k:=65535; // Максимальное значение типа Word

k:=k+1; // По правилам математики k=65536

IbOutput.Caption:=IntToStr(k); // На самом деле k=0!

end;

 

Если активизировать переключатель project | options | Compiler | Range checking и повторить компиляцию с помощью Project | Build All, компилятор вставит в программу код проверки переполнения и при прогоне программы возникнет исключительная ситуация, которую при желании можно соответствующим образом обработать. Заметим, что, если изменить программу следующим образом:

 

k:=65535; // Максимальное значение типа Word

//На экран будет выведено значение 65536

IbOutput.Caption:=IntToStr(k+1);

 

переполнения не произойдет, т.к. 32-разрядный компилятор версий Delphi 32 автоматически преобразует операнды выражения k+i к 4-байтным величинам.

 

Еще хуже ситуация складывается при возникновении арифметического переполнения у переменных со знаком – при этом самопроизвольно меняется знак числа.

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

Следующий пример - сложение двух 8-битовых чисел, представленных в двоичном коде, - иллюстрирует этот случай:

 

  Беззнаковое Знаковое
    +121
    +11
    -124
    (неправильно)

 

Сложение положительных чисел никогда не дает в результате отрицательного числа.

Результат сложения оказался непредставимым в диапазоне значений 8-битовых чисел в двоичном коде (от -128 до +127).

 

Также возможен случай одновременного арифметического переполнения беззнакового и знакового чисел:

 

  Беззнаковое Знаковое
    -10
    -119
    +127
  (неправильно) (неправильно)

 

<== предыдущая лекция | следующая лекция ==>
Встроенные типы данных | Вещественные типы. Сопроцессор
Поделиться с друзьями:


Дата добавления: 2014-01-06; Просмотров: 590; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.011 сек.