Страница: 1 | 2 |
Вопрос: проблема с Long
Добавлено: 21.02.07 21:47
Автор вопроса: ZoomerSD | ICQ: 148640473
Ответы
Всего ответов: 28
Номер ответа: 16
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #16
Добавлено: 22.02.07 16:41
Типа CLng дает понять VB, что 2000 - это не что-нибудь там, а Long, он меняет в переменной типа Variant (не могу быть точно уверен, но думаю, это так) тип на VT_I4, и поэтому результат последующего умножения не вызывает переполнения.
Номер ответа: 17
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #17
Добавлено: 22.02.07 16:55
Sharp, при чем тут Variant вообще? Он тут никаким боком...
Номер ответа: 18
Автор ответа:
W[4Fh]LF
Вопросов: 0
Ответов: 187
Web-сайт:
Профиль | | #18
Добавлено: 22.02.07 18:39
Sharp, ход действий при явном приведении очевиден, я думал это недокументированная особенность/бага компилятора, но как оказалось об этом известно и момент этот задокументирован. Так в чём смысл? Константы должны приводиться неявно, здесь это не учтено в силу каких-то других особенностей или это лень программистов МС?
Номер ответа: 19
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #19
Добавлено: 22.02.07 20:59
Не, ну почему в Си всё как у людей? Хотя те же мелкомягкие разрабатывали
Номер ответа: 20
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #20
Добавлено: 22.02.07 21:32
Они и приводятся.
Здесь это учтено.
Это твоя лень, т.к. ты не прочитал, по каким правилам они приводятся.
Номер ответа: 21
Автор ответа:
EUGY
Вопросов: 0
Ответов: 454
Профиль | | #21
Добавлено: 22.02.07 21:38
Хотя те же мелкомягкие разрабатывали ...
С чего ты взял??
Номер ответа: 22
Автор ответа:
W[4Fh]LF
Вопросов: 0
Ответов: 187
Web-сайт:
Профиль | | #22
Добавлено: 22.02.07 22:10
GSerg, ну просвети, я на ВБ долго не задерживался(чему и рад) и долгое время его уже не практикую, поэтому так и не постиг дао.
Номер ответа: 23
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #23
Добавлено: 22.02.07 22:36
#include <string>
using namespace std;
int main(){
string s = "123" + "456";
cout << s << endl;
return 0;
}
Попробуй скомпилить, и подумай, как компилятор догадается, до какого типа ему приводить константу?
Номер ответа: 24
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #24
Добавлено: 23.02.07 05:11
Если константа такова, что влезет в integer - будет integer. Если не влезет - будет long. Это документировано. А поскольку int+int=int, по приведению типов, то возникает переполнение при попытке присвоить вычисленный результат.
Номер ответа: 25
Автор ответа:
W[4Fh]LF
Вопросов: 0
Ответов: 187
Web-сайт:
Профиль | | #25
Добавлено: 23.02.07 09:18
Это понял, просто я полагал, что как и во всех других известных мне компиляторах приведение происходит по типу переменной, в которую будет записан результат.
Номер ответа: 26
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #26
Добавлено: 23.02.07 14:21
W[4Fh]LF, посмотри на мой пример на C++
Номер ответа: 27
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #27
Добавлено: 23.02.07 19:31
Ну тоже странно, я бы на месте компилятор привёл бы к string, типа как это делает вб...
но всё же в си работает
long a=0;
a = 422 * 1000;
cout << a << endl;
return 0;
}
а в вб нет На месте вб компилятора, лучше бы как в си, все операнты приобразовать к лонгу и выполнять умножение...
Номер ответа: 28
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #28
Добавлено: 23.02.07 22:55
А ты попробуй sizeof(422).
Выдает ошибку еще на этапе компиляции.