Как правильно записать смещение указателя в 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 шт):

Автор решения: MBo

Совсем чистого и красивого не вижу.

  1. Отнимать беззнаковое

    var offset: NativeUInt := 4;
    var p2 := Pointer(NativeUInt(p1) - offset);
    

    (вариант из комментария автора - складывать с беззнаковой константой, содержимое которой аналогично отрицательному числу)

    var offset: NativeUInt := NativeUInt(-4);
    var p2 := Pointer(NativeUInt(p1) + offset);
    
  2. Использовать только знаковые типы:

    var offset: NativeInt := -4;
    var p2 := Pointer(NativeInt(p1) + offset);
    

Единственный момент: 1 и 2 не будут работать, если включён контроль переполнения.

  1. Из комментария Alekcvp с арифметикой указателей:

    var offset: NativeInt := -4;
    var p2 := PByte(p1) + offset;
    
→ Ссылка