В C вам разрешено сдвигать отрицательные числа. Результат операции варьируется от системы к системе в зависимости от того, интерпретирует ли компилятор сдвиг как арифметический c сдвиг или логический сдвиг . Логический сдвиг заполняет верхние биты результата нулями, а арифметический c сдвиг заполняет верхние биты результата единицами, если исходное число было отрицательным.
Результат называется , определяемый реализацией, что означает, что каждый компилятор должен задокументировать, какое специфическое c поведение он собирается использовать. Так что проверьте документацию вашего компилятора для получения более подробной информации.
Тот факт, что это определяется реализацией, может объяснить, почему здесь нет предупреждений. Сдвиг отрицательного числа - это совершенно законный код C; просто это не всегда означает одно и то же во всех системах.
Надеюсь, это поможет!