Как правильно записать смещение указателя в Delphi?
Допустим у нас есть указатель и нам надо применить к нему смещение. Смещение может быть как положительное, так и отрицательное. По класские мы пишем вот так:
var p1: Pointer := Pointer($FF000000);
var offset: Integer := -4;
var p2 := Pointer(NativeUInt(p1) + offset); // <<--- варнинг
Компилятор выдает варнинг
[dcc32 Warning] Unit1.pas(30): W1024 Combining signed and unsigned types - widened both operands
Как правильно кастовать типы, чтобы варнинг ушел?
Ответы (1 шт):
Совсем чистого и красивого не вижу.
Отнимать беззнаковое
var offset: NativeUInt := 4; var p2 := Pointer(NativeUInt(p1) - offset);(вариант из комментария автора - складывать с беззнаковой константой, содержимое которой аналогично отрицательному числу)
var offset: NativeUInt := NativeUInt(-4); var p2 := Pointer(NativeUInt(p1) + offset);Использовать только знаковые типы:
var offset: NativeInt := -4; var p2 := Pointer(NativeInt(p1) + offset);
Единственный момент: 1 и 2 не будут работать, если включён контроль переполнения.
Из комментария Alekcvp с арифметикой указателей:
var offset: NativeInt := -4; var p2 := PByte(p1) + offset;