"&" в HEX-числах и переполнение

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

"&" в HEX-числах и переполнение

Сообщение SHURUP » 21.10.2004 (Чт) 17:58

Люди, вот такая вот штуковина, столкнулся с двумя проблемами. Знаю как их побороть 8) , но не знаю как их объяснить. :( :( :(
Проблема №1:
Код: Выделить всё
Private Sub problem1()
Dim a As Long, b As Long, c As Long,d As Long
    a = 200
    b = a * a       'b=40000
    c = 200 * 200   'вызывает Overflow
    d = 200 ^ 2     'd=40000
End Sub

Вроди бы обьявил все переменные как "лонг", результат - не так уж и велик, а вот при работе с литералами - возникает ошибка! Неужели результат операции "200 * 200" сначала пытается записатся в что-то типа Integer (-32,768 - 32,767)?
С другой стороны c = 200 ^ 2, что равносильно предыдущему (по крайней мере с математической точки зрения) - работает "на УРА"?

Проблема №2:
VB иногда само решает, где надо ставить в конце шеснадцатеричного числа "&", а где - НЕТ!
Например если набрать &HFF00FF& то редактор VB автоматически преобразует в &HFF00FF (мол ни к чему амперсанд в конце), а вот в некоторых случаях отсутствие "&" в конце НЕХ числа имеет роковое значение:
Код: Выделить всё
Private Sub problem2()
    MsgBox &HFF00FF And &HFF00& 'отображает 0 (и этот результат меня устраивает)
    MsgBox &HFF00FF And &HFF00  'отображает 16711680 (совсем не то)
End Sub

Вопрос: Что означает & в конце НЕХ числа и как обьяснить такую существенную разницу в значениях.
Нам чужого не надо, но своё мы возьмем, чьё бы оно ни было...

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

Сообщение tyomitch » 21.10.2004 (Чт) 18:08

Надо писать:
Код: Выделить всё
c = 200& * 200

Если в выражении оба аргумента влезают в Integer, а результат нет, то вот так и получается...

& отбрасывается в конце любого числа, не влезающего в Integer.
Его шестнадцатеричность тут не при чём: у 65536& он тоже отбросится.
Последний раз редактировалось tyomitch 21.10.2004 (Чт) 18:41, всего редактировалось 2 раз(а).
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 21.10.2004 (Чт) 18:09

Проблема №1.
VB отводит промежуточный буфер для решения, равный максимальному члену выражения. 200*200 - отводится 1-байтовый буфер.

Проблема №2.
Отсутствие & означает "уместить в integer, если влезает". Integer - он signed, и потому, если старший бит установлен, всё трактуется как отрицательное число. В то же время, бит 15 integer оказывается в середине long, поэтому переполнения signed не происходит.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение tyomitch » 21.10.2004 (Чт) 18:17

1. Нет. Отводимый буфер всегда как минимум 2-байтный.

2. Нет. Отсутствие & означает "угадать тип самому". 123.45, конечно же, в Integer компилятором не впихивается.

При чём здесь знак, я тоже не понял. Если ты имел в виду знаковое расширение при выполнении Long Xor Integer, то это нужно было сказать явно :-)
Последний раз редактировалось tyomitch 21.10.2004 (Чт) 18:20, всего редактировалось 1 раз.
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 21.10.2004 (Чт) 18:18

1. Допустим. Это я на основе прошлого опыта, а не глубокого анализа :)

2. Не путай. Я только про &H говорил :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение tyomitch » 21.10.2004 (Чт) 18:31

GSerg писал(а):2. Не путай. Я только про &H говорил :)

Ещё раз, & в конце числа и его шестнадцатеричность никак не связаны. Это две совершенно разные вещи.


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

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 21.10.2004 (Чт) 19:50

Ещё раз: :) я говорил о значении символа & в конце шестнадцатеричных чисел. Именно поэтому я проигнорировал всякие плавающие точки.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

SHURUP
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 440
Зарегистрирован: 15.09.2004 (Ср) 14:24
Откуда: Ирпень, Украина

Сообщение SHURUP » 21.10.2004 (Чт) 19:50

Я даже и не думал, что обе проблемы оказывается имеют общий "корень"
Теперь что-то прояснилось.
СПАСИБО ВСЕМ!
Нам чужого не надо, но своё мы возьмем, чьё бы оно ни было...


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

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

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

    TopList  
cron