Является ли оператор сдвига вправо в Objective C на OSX / iOS арифметическим или логическим сдвигом вправо? - PullRequest
2 голосов
/ 10 сентября 2011

Является ли оператор сдвига вправо в Objective C на OSX / iOS арифметическим или логическим сдвигом вправо?

Я не могу найти ссылки, которые указывают, является ли сдвиг вправо арифметическим или логическим, или же он варьируется в зависимости от типа данных (подписанный / неподписанный) и / или архитектуры (x86 / PPC / x64 / ARM).

«Программирование в Objective-C 2.0» гласит, что это фактически не определено, но это противоречит информации, которую я видел в других местах, когда компиляторы пытаются «делать правильные вещи» на основе подписи типов.

Ответы [ 2 ]

5 голосов
/ 10 сентября 2011

Objective-C не определяет поведение для оператора правого сдвига. Этот оператор определен в C. Вот соответствующая часть спецификации ANSI C:

Результатом E1 >> E2 является E1 со смещением вправо E2 битовые позиции. Если E1 имеет тип без знака или если E1 имеет тип со знаком и неотрицательное значение, значение результата является неотъемлемой частью частного E1 / 2 ^ E2 . Если E1 имеет тип со знаком и отрицательное значение, результирующее значение определяется реализацией.

Так что да, оператор сдвига вправо на отрицательном числе определяется реализацией в соответствии со спецификацией.

3 голосов
/ 10 сентября 2011

Я провел быстрый эксперимент на симуляторе iOS со следующим фрагментом:

int i = -600;

for (int j = 0; j < 68; j++)
{
    NSLog(@"j: %d i: %d", j, i);
    i = i >> 1;
}

Который дал результат:

j: 0 i: -600

j: 1 i: -300

j: 2 i: -150

j: 3 i: -75

j: 4 i: -38

j: 5 i: -19

j: 6 i: -10

j: 7 i: -5

j: 8 i: -3

j: 9 i: -2

j: 10 i: -1

j: 11 i: -1

...

Казалось бы, это указывает на то, что сдвиг арифметический, а не логический, поскольку знак ответа сохраняется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...