в твоём случае это не Warning, а Hint.
в твоём случае это не Warning, а Hint.
Нет. Стопроцентный warning (подсвечено жёлтым, я науськал MSEIde выделять хинты зелёным а вонинги жёлтым).
(я использую фпц 2.6.4 для сборки 32-битной версии и 3.1.1 для сборки 64-битной)
исходя из твоего фикса, ты утверждаешь, что при перемножении 64-битного на 32-битное, результат будет 32-битный?
ЕМНИП, Паскаль при операциях с целыми берёт наименьшую разрядность из двух операндов - так сложилось исторически. Поэтому надо кастовать мЕньший операнд к бОльшему, чтобы не получить на выходе тыкву.
В случае (k * f_Size) само умножение - пофиг, там не бывает больше 128К, но потом надо это значение скастовать к 64-битному, чтобы не порезало операцию сложения.
Потом мне говорят: если первый операнд - PByte, то ничего не порежет. а, наоборот, расширит до разрядности указателя.
Твой пример -
лажа, там переполнения в умножении прут и всё развозит (оба результата одинаковые, но ОБА некорректные).
Причём, проверять надо не какой Self на душу положит, а большой указатель > $ffffffff, причём, собирая под 64 бита.
Но... Что самое смешное -
все варианты работают корректно. Даже (pointer(ptruint(bigptr) + k * f_Size));
ИЧСХ, вонинги прут только при сборке под 32 бита. Кросс-компилятор x64 в этих местах молчит.
- Код: Выделить всё
program project1;
uses
cthreads,
sysutils,
Classes
;
type
TMyObject = class(TObject)
public
k, f_size : longint;
bigptr: pointer;
function Alloc: Pointer;
function Alloc2: Pointer;
end;
function TMyObject.Alloc: Pointer;
begin
Result:=(pointer(ptruint(bigptr) + k * f_Size));
end;
function TMyObject.Alloc2: Pointer;
begin
Result:=(pointer(ptruint(bigptr) + ptruint(k * f_Size)));
end;
var
m : TMyObject;
begin
m := TMyObject.Create;
m.bigptr:= pointer($100000000$400000);
m.k := 2;
m.f_size:= 2;
writeln(sizeof(pointer));
writeln(IntToHex(PtrUInt(m.bigptr), 16));
writeln(IntToHex(PtrUInt(m.Alloc), 16));
writeln(IntToHex(PtrUInt(m.Alloc2), 16));
end.
d:\stuff\tmp>c:\fpc\2.6.4\bin\i386-win32\ppcrossx64 -Twin64 project1.pas
Free Pascal Compiler version 2.6.4 [2014/03/06] for x86_64
Copyright (c) 1993-2014 by Florian Klaempfl and others
Target OS: Win64 for x64
Compiling project1.pas
Linking project1.exe
45 lines compiled, 0.2 sec , 174528 bytes code, 42852 bytes data
d:\stuff\tmp>project1
8
0000000100000000
0000000100000004
0000000100000004