Форум: "Начинающим";
Текущий архив: 2007.12.23;
Скачать: [xml.tar.bz2];
ВнизПриведение типов Найти похожие ветки
← →
Servelat (2007-11-24 16:06) [0]Здраствуйте. Наверное я сегодня туплю (=. Почему нельзя:
var
Size: LongInt;
E: Extended;
begin
Size := 50000;
E := Extended(Size);
явно привести Integer к Extended?
В приведенном примере это не критично, потому как можно просто убрать приведение типа, и все заработает. Однако, меня интересует сам факт, почему это Invalid typecast? Обнаружилось случайно при попытке сделать примерно такое выражение:
TempExtended := ((((8 * Extended(FileSize(Input)) - L + 1) * L) div 8) div 4) * 4 + 8;
← →
TUser © (2007-11-24 16:30) [1]> TempExtended := ((((8 * Extended(FileSize(Input)) - L + 1) * L) div 8) div 4) * 4 + 8;
А здесь ты зачем приведение типов делаешь?
← →
Anatoly Podgoretsky © (2007-11-24 16:44) [2]> Servelat (24.11.2007 16:06:00) [0]
Потому что размер разный.
Но это и не нужно.
← →
TUser © (2007-11-24 16:47) [3]Более того, приведенный "длинный" пример не должен компилироваться также и потому, что к extended"у нельзя применять операцию div.
← →
PASZLIB (2007-11-24 17:25) [4]С++ умеет
← →
Anatoly Podgoretsky © (2007-11-24 17:33) [5]> PASZLIB (24.11.2007 17:25:04) [4]
Форум по С++ где то рядом.
← →
Servelat (2007-11-24 17:43) [6]> Потому что размер разный.
У Boolean и Integer размер тоже не одинаковый, однако приводится ;).
> А здесь ты зачем приведение типов делаешь?
Этот кусок кода кинул мне в аську один товарищ, сишник. Просил объяснить, почему Invalid Typecast. После чего я написал короткий тест из [0], который показал, что действительно нельзя. Но мне не понятно, почему нельзя, ведь какой-то смысл в этом должен быть. Простое присваивание можно, а с приведением типа нельзя.
Вообще, проблемаTempExtended := ((((8 * Extended(FileSize(Input)) - L + 1) * L) div 8) div 4) * 4 + 8;
разумеется разрешима как минимум 2мя способами. Можно объявить дополнительную переменную типа Extended и присвоить ей FileSize, после чего использовать указанную формулу (вместо div - / есс-но). Либо использовать Int64.
Однако, меня интересует, из каких побуждений нельзя напрямую привести к типу Extended, не нагородив забор вродеfunction GetExtended(const I: Integer): Extended;
begin
Result := I;
end;
← →
Servelat (2007-11-24 17:47) [7]> Этот кусок кода кинул мне в аську один товарищ, сишник.
Приведение типов было им задумано во благо, так как FileSize * 8 в общем случае не влезет в Integer, а Int64 на Delphi3, которую он использовал, отсутствует (=.
← →
Anatoly Podgoretsky © (2007-11-24 19:46) [8]> Servelat (24.11.2007 17:43:06) [6]
Присваиваение не простое, а с преобразованием.
← →
Германн © (2007-11-24 19:54) [9]
> Однако, меня интересует, из каких побуждений нельзя напрямую
> привести к типу Extended
Приведение типов есть не что иное, как указание компилятору рассматривать область памяти занимаемой одной переменной как переменную другого типа. Но вещественное число 100 и целое число 100 хранятся в памяти совершенно по разному.
← →
TUser © (2007-11-24 19:56) [10]
> Приведение типов есть не что иное, как указание компилятору
> рассматривать область памяти занимаемой одной переменной
> как переменную другого типа.
Пиведения типа string() для переменной типа PChar и boolean() к интегеру допустимы :)
← →
Германн © (2007-11-24 20:02) [11]
> TUser © (24.11.07 19:56) [10]
>
>
Епстепственно :-)
← →
Anatoly Podgoretsky © (2007-11-24 20:07) [12]> TUser (24.11.2007 19:56:10) [10]
Приведение одного указателя к другому типу совместимому типу допустимо, приведение PChar к string не является приведение, а является присвоением, с преобразованием.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.12.23;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.062 c