В информатике смещение внутри массива или другого объекта структуры данных — это целое число, указывающее расстояние (смещение) между началом объекта и заданным элементом или точкой, предположительно внутри того же объекта. [1] : 100–103 Понятие расстояния справедливо только в том случае , если все элементы объекта имеют одинаковый размер (обычно задается в байтах или словах ).
Например, если A
— массив символов, содержащий "abcdef"
, то четвертый элемент, содержащий символ, 'd'
имеет смещение три от начала A
.
В компьютерной инженерии и низкоуровневом программировании (например, языке ассемблера ) смещение обычно обозначает количество адресных ячеек, добавленных к базовому адресу для получения определенного абсолютного адреса . В этом (исходном) значении смещения для указания размера смещения используется только базовая единица адреса, обычно 8-битный байт . В этом контексте смещение иногда называют относительным адресом .
В инструкциях IBM System/360 12-битное смещение, встроенное в некоторые инструкции, обеспечивало диапазон от 0 до 4096 байт. Например, в инструкции безусловного перехода (X'47F0Fxxx') 12-битное шестнадцатеричное смещение xxx обеспечивало смещение байта от базового регистра (15) для перехода. Нечетное смещение вызвало бы проверку программы (если только сам базовый регистр также не содержал нечетный адрес), поскольку инструкции должны были быть выровнены по границам полуслова для выполнения без программного или аппаратного прерывания .
Предыдущий пример описывает косвенный способ обращения к ячейке памяти в формате сегмент: смещение. Например, предположим, что мы хотим обратиться к ячейке памяти 0xF867. Один из способов сделать это — сначала определить сегмент с начальным адресом 0xF000, а затем определить смещение 0x0867. Кроме того, нам также разрешено сдвигать шестнадцатеричный сегмент, чтобы достичь конечного абсолютного адреса памяти. Здесь следует отметить, что мы можем достичь нашего конечного абсолютного адреса многими способами.
Смещение не всегда относительно базового адреса модуля, например: Если у вас есть класс и вы хотите получить атрибут "color" этого класса, смещение может быть 0x0100, но это смещение должно быть добавлено к смещению самого класса, а не к базовому адресу. Если смещение класса равно 0xFF881, а базовый адрес равен 0x0A100, то для получения атрибута "color" оба смещения добавляются к базовому адресу. 0x0A100 (база) + 0xFF881 (класс) + 0x0100 (атрибут). В конечном итоге адрес атрибута будет равен 0x109A81.