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