512 * 512

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

512 * 512

Сообщение Vovik » 20.02.2005 (Вс) 14:25

Вот интересная штука выходит... Пишу:

Dim l as long
l=512 * 512 - и тут компилятор пишет, что переполнение... :shock:

Хотя вот это работает:

Dim l as long

l = 1000000000 / 512 - результат гораздо больше, чем 512.... нонсенс :shock:

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 20.02.2005 (Вс) 14:27

А
Код: Выделить всё
l = 512 ^ 2

и
Код: Выделить всё
l = 512 * (512 ^ 1)

ошибки не вызывают :?

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 20.02.2005 (Вс) 14:34

Amed писал(а):А
Код: Выделить всё
l = 512 ^ 2

и
Код: Выделить всё
l = 512 * (512 ^ 1)

ошибки не вызывают :?
:shock: Отвал башки!!! Вот эти работают, а просто 512 * 512 - нифига... Эт че такое? :?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 20.02.2005 (Вс) 14:37

Код "l = 512& * 512" переполнения тоже не вызывает. А вот код "l = 32767 + 1" - вызывает.
RTFM!
Изображение

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 20.02.2005 (Вс) 14:41

tyomitch писал(а):Код "l = 512& * 512" переполнения тоже не вызывает. А вот код "l = 32767 + 1" - вызывает.
RTFM!
А че мне делать? у меня в переменных записаны числа.... ставить чель в первую степень? :roll:

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 20.02.2005 (Вс) 14:44

Код: Выделить всё
l = 512& * 512

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 20.02.2005 (Вс) 14:48

Amed писал(а):
Код: Выделить всё
l = 512& * 512
А с переменными прокатит? :roll:

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 20.02.2005 (Вс) 14:50

А самому не ага проверить? :?
Прокатит, я проверил :D

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 20.02.2005 (Вс) 14:57

(Люди, это что ли не прикол? Вы серьёзно возводите в степень раньше, чем подумать о типе значения?)
Изображение

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 20.02.2005 (Вс) 15:02

tyomitch писал(а):(Люди, это что ли не прикол? Вы серьёзно возводите в степень раньше, чем подумать о типе значения?)
Да не.... Просто вообще с этим никогда не сталкивался... :wink:

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 20.02.2005 (Вс) 15:24

Ок. На будущее:
- Если все константы, участвующие в вычислении, заключены от -32768 до 32767, то они имеют тип Integer, и релультат тоже будет иметь тип Integer. Если результат не помещается в этот диапазон, возникает переполнение.
- Чтобы пометить константу как имеющую тип Long, после неё ставится амперсенд.
- Результат операции ^ всегда имеет тип Double, поэтому при его использовании переполнения не возникает (но м.б. переполнение порядка, либо потеря точности).
Изображение

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 20.02.2005 (Вс) 15:28

Балсое Спасибо!!! :D

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 20.02.2005 (Вс) 17:43

а вот так лучше описывать константы:
Код: Выделить всё
Private Const MyLong as Long=12345678
Private Const MyString as String="retewrytetywet"

и тд и тп

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 20.02.2005 (Вс) 18:03

Konst_One, отгадай, чему будет равна константа, описанная как
Код: Выделить всё
Const MyLong As Long = &HABCD

:?:
Изображение

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 20.02.2005 (Вс) 19:16

FFFFABCD, чему же еще :roll:

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 20.02.2005 (Вс) 19:48

Вот поэтому и нужно писать не как Konst_One, а
Код: Выделить всё
Const MyLong = <что угодно>&


Тип гарантированно получается Long, +дополнительное преимущество - нет путаницы с шестнадцатеричными значениями от 00008000 до 0000FFFF.
Изображение

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 20.02.2005 (Вс) 21:36

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

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 20.02.2005 (Вс) 21:54

Нет никакого исключения. Объявление "As Long" описывает тип самой константы - если его нет, то он подбирается под тип её значения. А объявление "<что угодно>&" как раз и описывает тип значения константы.
Т.е. тут всё логично и непротиворечиво. Можно для смеха написать:
Код: Выделить всё
Private Const MyLong As Long = "1234"

Получится константа типа Long со значением 1234&.
Изображение


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

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

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

    TopList