Почему этот сдвиг вставляет 1 с?С - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь создать 32-битный двоичный файл со всеми 0, кроме srt до конца, который будет 1 с.Таким образом, если srt равно 2, а end равно 7, я получу 00000000 00000000 00000001 11111100. Когда я делаю вторую смену, это дает больше 1 с вместо нулей, я не знаю почему.Очень хорошо знал Си и немного манипулировал, если кто-то мог объяснить, я был бы очень благодарен.

int groupOne(int srt, int end){
    int mask =-1;
    int ret;
    ret = 1<<end;
    ret=ret<<srt;

    ret = mask+ret;
    return ret;
}

1 Ответ

0 голосов
/ 04 октября 2018

Из проекта Комитета C (N1570) о:

6.5.7 Операции сдвига по битам
...
Семантика
3 Целое числоПоощрения выполняются на каждом из операндов.Тип результата - тип повышенного левого операнда. Если значение правого операнда отрицательно или больше или равно ширине повышенного левого операнда, поведение не определено.

4 Результат E1 << E2 равен E1 сдвинутые влево E2 битовые позиции;освобожденные биты заполнены нулями.Если E1 имеет тип без знака, значение результата будет E1 × 2E2 (2 степени E2), уменьшено по модулю на единицу больше, чем максимальное значение, представляемое в типе результата.Если E1 имеет тип со знаком и неотрицательное значение, а E1 × 2E2 (2 степени E2) представимо в типе результата, то это итоговое значение;в противном случае поведение не определено.

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

...