Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: проблема с Long Добавлено: 21.02.07 21:47  

Автор вопроса:  ZoomerSD | ICQ: 148640473 

Ответить

  Ответы Всего ответов: 28  

Номер ответа: 16
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #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-сайт: hunger.ru
 Профиль | | #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-сайт: hunger.ru
 Профиль | | #22
Добавлено: 22.02.07 22:10
GSerg, ну просвети, я на ВБ долго не задерживался(чему и рад) и долгое время его уже не практикую, поэтому так и не постиг дао.

Ответить

Номер ответа: 23
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #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
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #24 Добавлено: 23.02.07 05:11
GSerg, ну просвети

Если константа такова, что влезет в integer - будет integer. Если не влезет - будет long. Это документировано. А поскольку int+int=int, по приведению типов, то возникает переполнение при попытке присвоить вычисленный результат.

Ответить

Номер ответа: 25
Автор ответа:
 W[4Fh]LF



Вопросов: 0
Ответов: 187
 Web-сайт: hunger.ru
 Профиль | | #25
Добавлено: 23.02.07 09:18
Это документировано.


Это понял, просто я полагал, что как и во всех других известных мне компиляторах приведение происходит по типу переменной, в которую будет записан результат.

Ответить

Номер ответа: 26
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #26
Добавлено: 23.02.07 14:21
W[4Fh]LF, посмотри на мой пример на C++ :)

Ответить

Номер ответа: 27
Автор ответа:
 HACKER


 

Разработчик 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
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #28
Добавлено: 23.02.07 22:55
А ты попробуй sizeof(422).
__int64 t = 1000000 * 1000000;

Выдает ошибку еще на этапе компиляции.

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам