Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.01.2011, 20:18   #1
Eva7
Новичок
Джуниор
 
Регистрация: 17.01.2011
Сообщений: 3
Радость Переполнение integer (Turbo Pascal).

Целочисленный тип integer определяет числа в диапазоне (-32768..32767), которые представляются в формате с фиксированной точкой. В случае присваивания переменной этого типа числа, выход. за пределы максимально\минимально допустимого, паскаль ошибки переполнения разрядной сетки не выдаёт, зато переменная принимает значения, зависимость между которой с правильным результатом я установить не могу.
Вот некоторые примеры:
1)48000(10)=1011 1011 1000 0000(2),
Но на мониторе: -17536(10)=-100 0100 1000 0000(2)
2)90000(10)=1 0101 1111 1001 0000(2), а выводит строку:
24464(10), (101 1111 1001 0000 в двоичной)
3)56000(10) =1101 1010 1100 0000, на мониторе:
-9536(10) (10 0101 0100 0000 в двоичной с.с.)
Объясните ,пожалуйста, каким образом получаются именно такие числа: я не могу есть, я не могу спать
Eva7 вне форума Ответить с цитированием
Старый 17.01.2011, 20:23   #2
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
я не могу есть, я не могу спать
Ешьте и спите.

1 + 1 = 10, правильно? А если у нас всего один бит для памяти, то будет 0.

1111 + 1 = 1 0000, но у нас 4 ячейки, следовательно = 0000
1111 + 10 = 1 0001 = 0001.

аналогично с большими цифрами.

На интеджере может немного расходиться, поскольку у него первый бит - это знак, а дальше не помню в каком порядке идет (кажись прямой для +, обратный для -). Короче переполнение происходит.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 17.01.2011, 21:08   #3
Eva7
Новичок
Джуниор
 
Регистрация: 17.01.2011
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Alex Cones Посмотреть сообщение

На интеджере может немного расходиться, поскольку у него первый бит - это знак, а дальше не помню в каком порядке идет (кажись прямой для +, обратный для -). Короче переполнение происходит.
=)
Если возникает переполнение, то "1" идёт в старший разряд- меняется знак на противоположный в не модифицированном коде. А что происходит с числовыми разрядами при смене знака на противоположный? (если только они не хранятся в доп. коде)..?
Eva7 вне форума Ответить с цитированием
Старый 17.01.2011, 21:11   #4
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
А что происходит с числовыми разрядами при смене знака на противоположный? (если только они не хранятся в доп. коде)..?
Напоминаю:
Код:
0XXX ... XXX1 = 1
1XXX ... XXX1 <> 1(!)
1XXX ... XXX1 = -32 676
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 17.01.2011, 21:13   #5
Eva7
Новичок
Джуниор
 
Регистрация: 17.01.2011
Сообщений: 3
Радость

Цитата:
Сообщение от Alex Cones Посмотреть сообщение
Напоминаю:
Код:
0XXX ... XXX1 = 1
1XXX ... XXX1 <> 1(!)
1XXX ... XXX1 = -32 676
Абсолютно точно и бесполезно. Спасибо
Eva7 вне форума Ответить с цитированием
Старый 17.01.2011, 21:14   #6
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
Спасибо
Это сарказм такой? Я вам показал, почему у вас такие цифры идут.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 18.01.2011, 01:33   #7
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

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

Так, например, беззнаковое число 65535 ($FFFF) при рассмотрении его как знакового превращается в -1 ($FFFF).

Теперь рассмотрим ваши примеры.

Цитата:
Сообщение от Eva7 Посмотреть сообщение
1)48000(10)=1011 1011 1000 0000(2),
Но на мониторе: -17536(10)=-100 0100 1000 0000(2)
На самом деле в памяти так и осталось беззнаковое 48000($BB80), которое, если его рассмтреть как знаковое в дополнительном коде будет равно -17536 ($BB80). Отрицательные числа не принято записывать со знаком не в десятичной системе (как -$4480), т.к. это только вносит путаницу (особенно смешно получается в двоичной системе, ведь там знак "-" должен превратиться в 1 в старшем бите). Попробуйте в среде паскаля просмотреть значение "-17536,h".

Цитата:
Сообщение от Eva7 Посмотреть сообщение
2)90000(10)=1 0101 1111 1001 0000(2), а выводит строку:
24464(10), (101 1111 1001 0000 в двоичной)
90000 ($15F90) не помещается в 2 байта, поэтому старший байт просто отбрасывается. Получаем $5F90 (24464). Т.к. старший бит = 0, число положительное.

Цитата:
Сообщение от Eva7 Посмотреть сообщение
3)56000(10) =1101 1010 1100 0000, на мониторе:
-9536(10) (10 0101 0100 0000 в двоичной с.с.)
Опять же, число $DAC0 можно рассматривать как беззнаковое 56000 и как знаковое -9536 в дополнительном коде ($DAC0).

Возьмите граничные случаи, может так будет проще:

$0000 (0) = 0 ($0000)
....
$7FFF (32767) = 32767 ($7FFF)
$8000 (32768) = -32768 ($8000)
...
$FFFF (65535) = -1 ($FFFF)
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вычесть из Integer Form2 Integer Form1 Shouldercannon Общие вопросы Delphi 2 30.07.2010 17:47
Turbo Pascal or Pascal ABC Ikram Паскаль, Turbo Pascal, PascalABC.NET 0 27.04.2010 13:44
сравнить 2 integer переменные БЕЗ IF или CASE (Pascal) dyonysos Помощь студентам 8 02.02.2010 17:51
а free pascal не читает задачи которые написаны на turbo pascal? demonara Паскаль, Turbo Pascal, PascalABC.NET 3 25.05.2009 16:28
integer, for, if в Pascal boom99 Помощь студентам 3 12.11.2007 16:25