![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Приведение типов
Servelat © (2007-11-24 16:06:00)Здраствуйте. Наверное я сегодня туплю (=. Почему нельзя:
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;
Anatoly Podgoretsky (2007-11-24 20:07:00) [1]> TUser (24.11.2007 19:56:10) [10]
Приведение одного указателя к другому типу совместимому типу допустимо, приведение PChar к string не является приведение, а является присвоением, с преобразованием.
Германн (2007-11-24 20:02:00) [2]
> TUser © (24.11.07 19:56) [10]
>
>
Епстепственно :-)
TUser (2007-11-24 19:56:00) [3]
> Приведение типов есть не что иное, как указание компилятору
> рассматривать область памяти занимаемой одной переменной
> как переменную другого типа.
Пиведения типа string() для переменной типа PChar и boolean() к интегеру допустимы :)
Германн (2007-11-24 19:54:00) [4]
> Однако, меня интересует, из каких побуждений нельзя напрямую
> привести к типу Extended
Приведение типов есть не что иное, как указание компилятору рассматривать область памяти занимаемой одной переменной как переменную другого типа. Но вещественное число 100 и целое число 100 хранятся в памяти совершенно по разному.
Anatoly Podgoretsky (2007-11-24 19:46:00) [5]> Servelat (24.11.2007 17:43:06) [6]
Присваиваение не простое, а с преобразованием.
Servelat (2007-11-24 17:47:00) [6]> Этот кусок кода кинул мне в аську один товарищ, сишник.
Приведение типов было им задумано во благо, так как FileSize * 8 в общем случае не влезет в Integer, а Int64 на Delphi3, которую он использовал, отсутствует (=.
Servelat (2007-11-24 17:43:00) [7]> Потому что размер разный.
У 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;
Anatoly Podgoretsky (2007-11-24 17:33:00) [8]> PASZLIB (24.11.2007 17:25:04) [4]
Форум по С++ где то рядом.
PASZLIB (2007-11-24 17:25:00) [9]С++ умеет
TUser (2007-11-24 16:47:00) [10]Более того, приведенный "длинный" пример не должен компилироваться также и потому, что к extended'у нельзя применять операцию div.
Anatoly Podgoretsky (2007-11-24 16:44:00) [11]> Servelat (24.11.2007 16:06:00) [0]
Потому что размер разный.
Но это и не нужно.
TUser (2007-11-24 16:30:00) [12]> TempExtended := ((((8 * Extended(FileSize(Input)) - L + 1) * L) div 8) div 4) * 4 + 8;
А здесь ты зачем приведение типов делаешь?