1.3.8. Операции сдвига

Содержание
Возврат к предыдущей части 1.3.7 Аддитивные операции

Операции сдвига осуществляют смещение операнда влево (<<) или вправо (>>) на число битов, задаваемое вторым операндом. Оба операнда должны быть целыми величинами. Выполняются обычные арифметические преобразования. При сдвиге влево правые освобождающиеся биты устанавливаются в нуль. При сдвиге вправо метод заполнения освобождающихся левых битов зависит от типа первого операнда. Если тип unsigned, то свободные левые биты устанавливаются в нуль. В противном случае они заполняются копией знакового бита. Результат операции сдвига не определен, если второй операнд отрицательный.

Преобразования, выполненные операциями сдвига, не обеспечивают обработку ситуаций переполнения и потери значимости. Информация теряется, если результат операции сдвига не может быть представлен типом первого операнда, после преобразования.

Отметим, что сдвиг влево соответствует умножению первого операнда на степень числа 2, равную второму операнду, а сдвиг вправо соответствует делению первого операнда на 2 в степени, равной второму операнду.

Примеры:

1
2
3
4
      int  i=0x1234, j,  k ;
      k = i<<4 ;       /* k="0x0234" */ 
      j="i<<8" ;       /* j="0x3400" */ 
      i="j">>8 ;         /*    i = 0x0034   */

Читать далее. Раздел 1.3.9. Поразрядные операции
Содержание

5 thoughts on “1.3.8. Операции сдвига”

  1. k = i<<4 ; /* k="0x0234" */

    тут опечатка или все правильно? По описанию если двигать влево на 4 бита, то к=0х0034, а если двигать на 3 бита, то 'к' правильное, или я не так понимаю?

  2. Тут действительно ошибка, во второй строчке правильно будет «2340»:

    int i=0x1234, j, k ;
    k = i<<4 ; /* k="0x0234" */ <- ошибка тут, вместо "0x0234" должно быть "0x2340".
    j="i<>8 ; /* i = 0x0034 */

  3. В следующем пункте 1.3.9 тоже ошибка в примере. В шестнадцатеричной системе значение записано правильно, а в двоичной — с ошибкой. Строка №5 должна выглядеть следующим образом:

    5 r = i|j; /* r=0x45FF = 0100 0101 1111 1111 */

Добавить комментарий

Ваш e-mail не будет опубликован.

Перед отправкой формы:
Human test by Not Captcha