Добавление ответа Мэтта для нескольких хостов.
пример ввода будет 192.0.2.10,192.0.2.11
- hosts: localhost
gather_facts: no
vars_prompt:
- name: target_host
prompt: please enter the target host IP
private: no
tasks:
- add_host:
name: "{{ item }}"
groups: dynamically_created_hosts
with_items: "{{ target_host.split(',') }}"
- hosts: dynamically_created_hosts
tasks:
- debug: msg="do things on target host here"
Негативные целые числа в правой части - неопределенное поведение на языке C.
ISO 9899: 2011 6.5.7 Операторы битового сдвига:
Целое число рекламные акции выполняются на каждом из операндов. Тип результата - это продвинутый левый операнд. Если значение правильного операнда отрицательное или больше или равно ширине продвинутого левого операнда, поведение не определено.
blockquote>
Как уже ответили другие члены, он вызывает неопределенное поведение. То, что я хотел бы упомянуть здесь, - это то, что вы цитируете из книги («На одной машине»), кажется, частичной. Он не обобщает поведение. Книга также могла бы объяснить, что поведение не определено в соответствии со стандартом. BTW, я просто проходил «Новый стандарт C - экономический и культурный комментарий» и нашел это заявление:
Инструкция Intel Socket Intel для SAL (сгенерированная как gcc, так и Microsoft C ++ для оценки слева -shifts) использует только нижние пять бит величины сдвига
blockquote>. Это очень хорошо объясняет, почему сдвиг влево -5 может привести к сдвигу влево 27 (для представления дополнения 2 отрицательного числа)
Если значение, которое вы смещаете, является 32-битной переменной, сдвиг -5 переходит в «цикл» и сдвигает вперед 27. Сдвиг может выполняться только «без знака».
Поведение неопределено.
В 5-битовой двоичной арифметике, two's-complement -5 имеет то же двоичное представление, что и unsigned +27, что, вероятно, объясняет эту конкретную платформу.
int main()
{
unsigned int a = 1;
printf("%u\n",a<<(-1));
return 0;
}
Выходной сигнал: 2147483648.
Вот мое предположение и подтверждение: (просто предположение!) [/ g1]
1. «& lt; правый операнд должен быть неподписанным типом int,
, поэтому, во-первых, (int) «-1» будет введен в (unsigned int) «-1». Причина Тип int представляет собой представление с двумя дополнениями, результат будет равен 2 ^ 32-1 (без знака int)
2.Due на номер 2 ^ 32-1 больше, чем цифра максимального смещения, 2 ^ 32 - 1 будет mod 32, что равно 27
. Я также пробовал некоторые другие правильные номера операндов, а результаты ручного вычисления с допущенными правилами будут одинаковыми с каким продуктом моей IDE.
Я пытаюсь найти некоторые поддерживающие официальные документы, ведь можно проверить, правильно ли мое предположение или нет. Может быть, вы можете мне сказать.
a << (unsigned int)-5
, что означало быa << 0xFFFFFFFB
, что также UB приведенным выше текстом. – Lundin 26 May 2015 в 13:12