Результат умножения двух Integer (как у тебя) VB пытается поместить в Integer, а 72 000 туда не вмещается. Надо использовать символ & после числа (можно только для одного из операндов) v = 72& * 1000&. Результат будет Long.empty-name писал(а):Dim v As Long
v = 72 * 1000
на выражение ругается ошибкой overflow (переполнение)
почему? у меня же long там оч большие цифры должны помещаться
Вообще конечно странная логика. Нет оно конечно будет так как написал Viper, но я имею ввиду логику, которой руководствовались разработчики. А странная потому, что на каком таком основании принимается решение о том, что 72 и 1000 это значения типа Integer? Оно с таким же успехом входит и в диапазон значений типа Long, а 72 еще и в диапазон типа Byte. Было бы логично при этом определять тип по типу переменной, в которую помещается значение, и в данном примере это будет Long. Поэтому логично предположить, что если приемник типа Long, то и два операнда, попадающие в этот диапазон тоже имеют этот тип. Опять же приложение 32х разрядное и Long это можно сказать родной тип, но нет, почему то VB считает, что это Integer. Ну никакой логики.Viper писал(а):Результат умножения двух Integer (как у тебя) VB пытается поместить в Integer
Это что, со времен 16х систем пошло? Пора бы уже перейти на новые рельсы, сразу на 64х типыQwertiy писал(а):Во всех нормальных языках программирования по умолчанию тип констант int
ger_kar писал(а):Это что, со времен 16х систем пошло? Пора бы уже перейти на новые рельсы, сразу на 64х типыQwertiy писал(а):Во всех нормальных языках программирования по умолчанию тип констант int
Tmp3 = 2230226227 ' это -> &H84EE8D33
Mask1 = &H7FFFFF
Tmp = (Tmp3 And Mask1)
Penumbra писал(а):у меня таже проблема только числа намного больше
на последней строке выдает переполнение
Penumbra писал(а):перевести в 2230226227 а не в -2064741069
Хакер писал(а):Воистину у тебя та же проблема:
Penumbra писал(а):Tmp3 = 2230226227 ' это -> &H84EE8D33
Tmp3 = &H84EE8D33
Penumbra писал(а):как заставить бейсик &H84EE8D33
перевести в 2230226227 а не в -2064741069
Debug.Print &H8000& = &H8000
Целых три совета, но всего одна ответаХакер писал(а):Воистину у тебя та же проблема: ты не сделал того, чего рекомендуют здесь. Ещё раз читай вот это. А потом вот это.
Mikle писал(а):А вообще перемудрили, конечно, с шестнадцатиразрядной записью, например:
Mikle писал(а):А вообще перемудрили, конечно, с шестнадцатиразрядной записью, например: Debug.Print &H8000& = &H8000
А разве не должно? Два сравниваются два одинаковых значения в итоге должно быть True. Даже если тип и другой, но значение то одинаковые!Хакер писал(а):По твоему должно быть True?
Теперь да. А вообще-то конечно, плохо, что в VB нет беззнаковых типов данных, кроме конечно byte.Хакер писал(а):Всё крайне логично.
Mikle писал(а):А вообще перемудрили, конечно, с шестнадцатиразрядной записью,
#include <stdio.h>
int main()
{
if( (int)0x8000 == (short)0x8000 ) // с учётом того, что Long → int, а Integer → short.
printf("TRUE");
else
printf("FALSE");
}
Хакер писал(а):После того, как Integer преобразуется в Long, мы имеем два неодинаковых Long-числа.
Всё крайне логично.
Хакер писал(а):Кто перемудрил? Разработчики VB?
Mikle писал(а):Но именно при шестнадцатеричной ЗАПИСИ эта логика нарушается, правильнее было бы делать эту запись по тем же законам, что и десятичная запись, включая дроби
Mikle писал(а):Да, тогда у отрицательных чисел будет минус.
Хакер писал(а):Теперь представь себе, каким адским трубом было бы передекларирование всех внешних констант на новый hex-лад?
Хакер писал(а):Но смысл hex-записи дробных чисел я вообще не уливливаю.
Хакер писал(а):Кто перемудрил? Разработчики VB?
Тогда вот аналогичное на Си:
puts(0x80000000LL==0x80000000 ? "yes" : "no");
Qwertiy писал(а):А если так:Константа без суффикса имеет unsigned int, константа с суффиксом LL signed long long. Делается неявное приведение обеих к unsigned long long и получается true.
- Код: Выделить всё
puts(0x80000000LL==0x80000000 ? "yes" : "no");
iGrok писал(а):Эмм.. Это у тебя подгон под результат, а не у Хакера. У него взяты ТЕ ЖЕ типы, что и в варианте, который написан для VB, а у тебя - другие. Более "вместительные".
puts(0x80000000LL==0x80000000 ? "yes" : "no");
puts((long long)0x80000000==(int)0x80000000 ? "yes" : "no");
Qwertiy писал(а):Суть в том, что шестнадцатеричные и восмеричные константы без суффиксов рассматриваются в Си как беззнаковые.
iGrok писал(а):У него взяты ТЕ ЖЕ типы, что и в варианте, который написан для VB, а у тебя - другие.
Хакер писал(а):Qwertiy писал(а):Суть в том, что шестнадцатеричные и восмеричные константы без суффиксов рассматриваются в Си как беззнаковые.
О чём и речь:iGrok писал(а):У него взяты ТЕ ЖЕ типы, что и в варианте, который написан для VB, а у тебя - другие.
Хакер писал(а):% и так предполагается по умолчанию
Qwertiy писал(а):Вот в этом-то и заключается отличие VB от Си, которое ты спрятал, поставив явное приведение.
Хакер писал(а):В си тип int тоже предполагается по умолчанию.
Сейчас этот форум просматривают: Google-бот и гости: 73