ошибка overflow

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
empty-name
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 18
Зарегистрирован: 30.01.2010 (Сб) 20:31
Откуда: Белая Калитва

ошибка overflow

Сообщение empty-name » 04.12.2011 (Вс) 12:17

Dim v As Long
v = 72 * 1000
на выражение ругается ошибкой overflow (переполнение)
почему? у меня же long там оч большие цифры должны помещаться
Думаю все же, будущее искусственного интеллекта за эвристическим программированием

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 04.12.2011 (Вс) 13:01

72 и 1000 - инты, а не лонги. Хотя мне казалось, что должно работать.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: ошибка overflow

Сообщение Viper » 04.12.2011 (Вс) 13:11

empty-name писал(а):Dim v As Long
v = 72 * 1000
на выражение ругается ошибкой overflow (переполнение)
почему? у меня же long там оч большие цифры должны помещаться
Результат умножения двух Integer (как у тебя) VB пытается поместить в Integer, а 72 000 туда не вмещается. Надо использовать символ & после числа (можно только для одного из операндов) v = 72& * 1000&. Результат будет Long.
Весь мир матрица, а мы в нем потоки байтов!

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: ошибка overflow

Сообщение ger_kar » 04.12.2011 (Вс) 13:42

Viper писал(а):Результат умножения двух Integer (как у тебя) VB пытается поместить в Integer
Вообще конечно странная логика. Нет оно конечно будет так как написал Viper, но я имею ввиду логику, которой руководствовались разработчики. А странная потому, что на каком таком основании принимается решение о том, что 72 и 1000 это значения типа Integer? Оно с таким же успехом входит и в диапазон значений типа Long, а 72 еще и в диапазон типа Byte. Было бы логично при этом определять тип по типу переменной, в которую помещается значение, и в данном примере это будет Long. Поэтому логично предположить, что если приемник типа Long, то и два операнда, попадающие в этот диапазон тоже имеют этот тип. Опять же приложение 32х разрядное и Long это можно сказать родной тип, но нет, почему то VB считает, что это Integer. Ну никакой логики.
Бороться и искать, найти и перепрятать

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 04.12.2011 (Вс) 15:28

Во всех нормальных языках программирования по умолчанию тип констант int и double. И значение вычисляется в соответствии с типами операндов, а не того, чему оно присваивается (что в Си, например, вообще может отсутствовать).

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: ошибка overflow

Сообщение ger_kar » 04.12.2011 (Вс) 15:32

Qwertiy писал(а):Во всех нормальных языках программирования по умолчанию тип констант int
Это что, со времен 16х систем пошло? Пора бы уже перейти на новые рельсы, сразу на 64х типы ;)
Бороться и искать, найти и перепрятать

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 04.12.2011 (Вс) 16:19

ger_kar писал(а):
Qwertiy писал(а):Во всех нормальных языках программирования по умолчанию тип констант int
Это что, со времен 16х систем пошло? Пора бы уже перейти на новые рельсы, сразу на 64х типы ;)

Только int сейчас 32-битный. Вообще-то, не понимаю, почему его не сделать 64-битным на соответствующих машинах. А то только проблемы с указателями создаёт...

Penumbra
Обычный пользователь
Обычный пользователь
 
Сообщения: 62
Зарегистрирован: 24.01.2009 (Сб) 13:36

Re: ошибка overflow

Сообщение Penumbra » 11.12.2011 (Вс) 4:58

у меня таже проблема только числа намного больше

Код: Выделить всё
Tmp3 = 2230226227  '  это ->  &H84EE8D33
Mask1 = &H7FFFFF
Tmp = (Tmp3 And Mask1)

на последней строке выдает переполнение
в место Long пробывал Double
да еще
как заставить бейсик &H84EE8D33
перевести в 2230226227 а не в -2064741069

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: ошибка overflow

Сообщение Хакер » 11.12.2011 (Вс) 6:56

Penumbra писал(а):у меня таже проблема только числа намного больше
на последней строке выдает переполнение

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

Penumbra писал(а):перевести в 2230226227 а не в -2064741069

А это одно, и то же, родной. Как 5 часов и 17 часов.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: ошибка overflow

Сообщение Mikle » 11.12.2011 (Вс) 9:56

Хакер писал(а):Воистину у тебя та же проблема:

Нет, проблема даже больше - он пытается получить результат логической операции от Double переменных, бейсик их автоматом пытается привести к Long, а результат не помещается.
Penumbra писал(а):Tmp3 = 2230226227 ' это -> &H84EE8D33

Кто тебе мешает так и написать:
Код: Выделить всё
Tmp3 = &H84EE8D33

И все три переменных определить, как Long?
Penumbra писал(а):как заставить бейсик &H84EE8D33
перевести в 2230226227 а не в -2064741069

Ты пойми, что если ты и переведёшь величину так, то в Long она уже не поместится.
А вообще перемудрили, конечно, с шестнадцатиразрядной записью, например:
Код: Выделить всё
Debug.Print &H8000& = &H8000

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: ошибка overflow

Сообщение ger_kar » 11.12.2011 (Вс) 15:16

Хакер писал(а):Воистину у тебя та же проблема: ты не сделал того, чего рекомендуют здесь. Ещё раз читай вот это. А потом вот это.
Целых три совета, но всего одна ответа :)
Бороться и искать, найти и перепрятать

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: ошибка overflow

Сообщение Хакер » 11.12.2011 (Вс) 15:28

Mikle писал(а):А вообще перемудрили, конечно, с шестнадцатиразрядной записью, например:

По твоему должно быть True?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: ошибка overflow

Сообщение ger_kar » 11.12.2011 (Вс) 15:50

Mikle писал(а):А вообще перемудрили, конечно, с шестнадцатиразрядной записью, например: Debug.Print &H8000& = &H8000

Хакер писал(а):По твоему должно быть True?
А разве не должно? Два сравниваются два одинаковых значения в итоге должно быть True. Даже если тип и другой, но значение то одинаковые!
Бороться и искать, найти и перепрятать

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: ошибка overflow

Сообщение Хакер » 11.12.2011 (Вс) 16:03

Не должно.

Сравниваются не два одинаковых значения. Надо просто правильно строить мысль.

Итак.
Два разнотипных значения никогда нельзя сравнить. Нигде. Всегда везде при сравнении разнотипных величин одна из величин конвертируется так, чтобы тип стал одинаковый. Так? Например если сравнивать, Double и Byte, то Byte преобразуется в Double, и будет сравнение двух Double-ов. Если сравнивается строка и число, то либо число конвертируется в строку, и сравниваются две строки, либо строка в число, и сравнивается два числа (зависит от языка, что во что).
Всегда разнотипные величины преобразуются в однотипные, и только потом однотипные сравниваются.

С этим будет кто-то спорить? Никто.

Дальше. Здесь мы имеем два разнотипных значения. Прежде чем их сравнить, необходимо «привести к общему знаменателю» (сделать их однотипными). Поскольку приводятся «к большему», то Integer превращается в Long, а не наоборот. После того, как Integer преобразуется в Long, мы имеем два неодинаковых Long-числа.

Всё крайне логично.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: ошибка overflow

Сообщение ger_kar » 11.12.2011 (Вс) 16:30

Хакер писал(а):Всё крайне логично.
Теперь да. А вообще-то конечно, плохо, что в VB нет беззнаковых типов данных, кроме конечно byte.
Бороться и искать, найти и перепрятать

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: ошибка overflow

Сообщение Хакер » 11.12.2011 (Вс) 16:32

И вот ещё.
Mikle писал(а):А вообще перемудрили, конечно, с шестнадцатиразрядной записью,

Кто перемудрил? Разработчики VB?
Тогда вот аналогичное на Си:
Код: Выделить всё
#include <stdio.h>

int main()
{
    if( (int)0x8000 == (short)0x8000 )  // с учётом того, что Long → int, а Integer → short.
        printf("TRUE");
    else
        printf("FALSE");
}
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: ошибка overflow

Сообщение Mikle » 11.12.2011 (Вс) 19:06

Хакер писал(а):После того, как Integer преобразуется в Long, мы имеем два неодинаковых Long-числа.
Всё крайне логично.

Нет, не логично. Приводя Integer к Long мы никогда не получим из отрицательного числа положительное, а приводя отрицательное к беззнаковому - получим ошибку. Это - логично. Но именно при шестнадцатеричной ЗАПИСИ эта логика нарушается, правильнее было бы делать эту запись по тем же законам, что и десятичная запись, включая дроби (а почему нет?).
Хакер писал(а):Кто перемудрил? Разработчики VB?

Нет, задолго до них, кто конкретно - не интересовался.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: ошибка overflow

Сообщение Хакер » 11.12.2011 (Вс) 19:10

Mikle писал(а):Но именно при шестнадцатеричной ЗАПИСИ эта логика нарушается, правильнее было бы делать эту запись по тем же законам, что и десятичная запись, включая дроби

Ты предлагаешь объявить все константы от &h80000000 до &hFFFFFFFF вне закона, а вместо них призвать использовать константы от –&h7FFFFFFF до –&hF1?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: ошибка overflow

Сообщение Mikle » 11.12.2011 (Вс) 19:14

Да, тогда у отрицательных чисел будет минус. А ещё неплохо было бы иметь такую запись:
&H3.5 = три целых пять шестнадцатых.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: ошибка overflow

Сообщение Хакер » 11.12.2011 (Вс) 19:19

Mikle писал(а):Да, тогда у отрицательных чисел будет минус.

Теперь представь себе, каким адским трубом было бы передекларирование всех внешних констант на новый hex-лад? Но смысл hex-записи дробных чисел я вообще не уливливаю.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: ошибка overflow

Сообщение Mikle » 11.12.2011 (Вс) 19:28

Хакер писал(а):Теперь представь себе, каким адским трубом было бы передекларирование всех внешних констант на новый hex-лад?

Естественно, ломать стандарты тяжело. Я просто заметил, что жаль, что так не сделали изначально.
Хакер писал(а):Но смысл hex-записи дробных чисел я вообще не уливливаю.

Универсальность, единое правило записи числовых констант, в ЛЮБОЙ системе счисления, например так:
&(7)2.12 = две целых двенадцать сорок девятых.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 12.12.2011 (Пн) 0:11

Хакер писал(а):Кто перемудрил? Разработчики VB?
Тогда вот аналогичное на Си:

Не надо подгонять код под желаемый результат :)

А если так:
Код: Выделить всё
  puts(0x80000000LL==0x80000000 ? "yes" : "no");
Константа без суффикса имеет unsigned int, константа с суффиксом LL signed long long. Делается неявное приведение обеих к unsigned long long и получается true.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: ошибка overflow

Сообщение iGrok » 12.12.2011 (Пн) 0:21

Qwertiy писал(а):А если так:
Код: Выделить всё
  puts(0x80000000LL==0x80000000 ? "yes" : "no");
Константа без суффикса имеет unsigned int, константа с суффиксом LL signed long long. Делается неявное приведение обеих к unsigned long long и получается true.

Эмм.. Это у тебя подгон под результат, а не у Хакера. У него взяты ТЕ ЖЕ типы, что и в варианте, который написан для VB, а у тебя - другие. Более "вместительные".
label:
cli
jmp label

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 12.12.2011 (Пн) 0:39

iGrok писал(а):Эмм.. Это у тебя подгон под результат, а не у Хакера. У него взяты ТЕ ЖЕ типы, что и в варианте, который написан для VB, а у тебя - другие. Более "вместительные".

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

Код: Выделить всё
  puts(0x80000000LL==0x80000000 ? "yes" : "no");
  puts((long long)0x80000000==(int)0x80000000 ? "yes" : "no");
Первый результат yes, а второй - no :)

Можно скомпилировать для long и int 16-разрядным компилятором :)
Суть в том, что шестнадцатеричные и восмеричные константы без суффиксов рассматриваются в Си как беззнаковые.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: ошибка overflow

Сообщение Хакер » 12.12.2011 (Пн) 8:02

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

О чём и речь:
iGrok писал(а):У него взяты ТЕ ЖЕ типы, что и в варианте, который написан для VB, а у тебя - другие.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 12.12.2011 (Пн) 13:08

Хакер писал(а):
Qwertiy писал(а):Суть в том, что шестнадцатеричные и восмеричные константы без суффиксов рассматриваются в Си как беззнаковые.

О чём и речь:
iGrok писал(а):У него взяты ТЕ ЖЕ типы, что и в варианте, который написан для VB, а у тебя - другие.

На мой взгляд, твоему варианту соответствует запись &H8000& = &H8000%, а не та, которая приведена в вопросе.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: ошибка overflow

Сообщение Хакер » 12.12.2011 (Пн) 14:37

% и так предполагается по умолчанию. Более того, если ты напишешь свой вариант, то среда насильно уберёт процентный TDC из твоей записи. Хотя, конечно, никто не запрещает тебе иметь свой взгляд.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 12.12.2011 (Пн) 17:24

Хакер писал(а):% и так предполагается по умолчанию

Вот в этом-то и заключается отличие VB от Си, которое ты спрятал, поставив явное приведение.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: ошибка overflow

Сообщение Хакер » 12.12.2011 (Пн) 17:35

Qwertiy писал(а):Вот в этом-то и заключается отличие VB от Си, которое ты спрятал, поставив явное приведение.

В си тип int тоже предполагается по умолчанию. Никакого отличия.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 12.12.2011 (Пн) 18:39

Хакер писал(а):В си тип int тоже предполагается по умолчанию.

Нет, int по умолчанию только для десятичных констант. Для шестнадцатеричных и восьмеричных по умолчанию unsigned.

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 73

    TopList