Почему смещение больше, чем допустимые биты, все еще работает?


У меня есть int8_t, и я хотел посмотреть, что произойдет, если я сдвину его влево дальше, чем на 8 бит. Вот что я сделал:

int8_t x = 1;

std::cout << (x << 10);

По какой-то причине это возвращает 1024, как если бы тип содержал достаточно битов, чтобы представить это число. Я думал, что когда вы сдвигаете больше, чем заданные биты, вы получите 0 во всех битах (или знаковое переполнение/underflow, которое приводит к неопределенному поведению). Кроме того, я запустил этот код, чтобы дать мне максимальное число int8_t:

std::numeric_limits<int8_t>::max(); // 127

Максимальное число этого тип 127, но смещение его влево может сделать его даже выше, чем его беззнаковый тип! Как такое возможно?

1 4

1 ответ:

Аргументы в << неявно расширяются до int, и результат x << 10 также является int.