Оберон-клуб «ВЄДАsoft» https://zx.oberon.org/forum/ |
|
Получение информации о свободном месте на диске https://zx.oberon.org/forum/viewtopic.php?f=79&t=399 |
Страница 1 из 1 |
Автор: | Len [ 16 сен 2018, 14:02 ] |
Заголовок сообщения: | Получение информации о свободном месте на диске |
Я написал небольшую процедурку, но почему-то она выдаёт отрицательное число в самом конце: при умножении трёх положительных чисел. Может только у меня такой глюк? Код: "OBERON"
|
Автор: | Comdiv [ 16 сен 2018, 22:36 ] |
Заголовок сообщения: | Re: Получение информации о свободном месте на диске |
Перед тем как ответить напрямую, предлагаю провести эксперимент. Если бы приложение завершилось аварийно с выведением сообщения такого рода Код: "OBERON"
|
Автор: | Len [ 17 сен 2018, 02:41 ] |
Заголовок сообщения: | Re: Получение информации о свободном месте на диске |
Т.к. overflow переводится как переполнение, то вы имеете в виду, что я отправил в процедуру StdLog.Int слишком большое значение? Но как тогда выполняется StdLog.Int(MAX(LONGINT))? |
Автор: | Zorko [ 17 сен 2018, 14:18 ] |
Заголовок сообщения: | Re: Получение информации о свободном месте на диске |
MAX(INTEGER) = 2147483647 16 * 512 * 2061913 = 16891191296 Соответственно, мы должны явно указать компилятору о нашем желании произвести вычисления в длинном типе LONGINT: Код: "OBERON"
|
Автор: | Len [ 17 сен 2018, 14:32 ] |
Заголовок сообщения: | Re: Получение информации о свободном месте на диске |
Скажите, а почему компилятор понижает разряды, если написать так: Код: "OBERON"
Как-то странно: если числа ввести константами, то не понижает... |
Автор: | Len [ 17 сен 2018, 14:52 ] |
Заголовок сообщения: | Re: Получение информации о свободном месте на диске |
Совсем забыл: Паскалю вообще не свойственно автоматическое приведение типов. |
Автор: | Comdiv [ 17 сен 2018, 16:21 ] |
Заголовок сообщения: | Re: Получение информации о свободном месте на диске |
Всё не так. Никто ничего не понижает. Переполнение происходит во время умножения(mul в гипотетическом сообщении), так как значения вычисляются в типе INTEGER. Log.Int принимает параметр типа LONGINT, поэтому он и может принять значение INTEGER, но оно уже искажено переполнением. Значение перемноженных констант, сразу идёт в типе LONGINT, потому что компилятор знает, что получаемое значение не помещается в диапазон INTEGER. |
Автор: | Comdiv [ 17 сен 2018, 16:35 ] |
Заголовок сообщения: | Re: Получение информации о свободном месте на диске |
Документация к StdLog, кстати, вводит в заблуждение. Думаю, это скоро поправят Цитата: PROCEDURE Int (i: INTEGER) Writes an integer value to the log. Код: "OBERON"
|
Автор: | Zorko [ 18 сен 2018, 18:30 ] |
Заголовок сообщения: | Re: Получение информации о свободном месте на диске |
Len писал(а): Скажите, а почему компилятор понижает разряды, если написать так: Len, достаточно знать, что в языке КП по умолчанию целочисленная арифметика является 32-битной (тип INTEGER). Всегда. Кроме тех случаев, когда явно указать компилятору, что нужно перейти к LONGINT.Код: "OBERON"
Как-то странно: если числа ввести константами, то не понижает... В выражении i5 := 16 * 512 * i3 переменная i5 конечно типа LONGINT, но такая переменная принимает результат вычислений типа INTEGER тоже. Что и имеет место в данном случае. Приводить константу 16 или 512 к LONGINT нет смысла. Надо приводить переменную i3, притом _перед_ вычислением, а не после него. И тогда компилятор будет работать в диапазоне уже не INTEGER, как это он делает по умолчанию, а LONGINT, как указал ему программист. Вроде всё просто. У меня с этим никогда не было проблем. |
Страница 1 из 1 | Часовой пояс: UTC + 2 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |