Непонятно, чего вы хотите достичь. Маскировка младших бит при сохранении знакового бита - это то, что вы можете сделать с одной маской на архитектурах, где int
представлен как знак/величина. Весьма маловероятно, что вы будете думать об этом странном случае. Какова ваша цель?
Помните, что маскирование - это не то же самое, что ограничение диапазона. За исключением самых тривиальных случаев, ограничивая диапазон не может быть достигнуто с помощью малярной (тривиальные случаи быть ограничивающими 0..0
и ограничивая INT_MIN..INT_MAX
)
Если вы просто хотите, чтобы ограничить использование диапазона это:
int j = i < -31 ? -31 : i > 31 ? 31 : i;
Вы можете заменить любые значения int
минимальными и максимальными значениями. i
оценивается дважды в этом выражении: если вы подставляете сложное выражение, лучше использовать временную переменную. В некоторых случаях компилятор может генерировать код без скачков для этих тестов, забыв пробовать сделать это вручную.
Ожидаемое значение: 20. Как вы когда-нибудь получите -31 от этого? – harold
Действительно, вы удалили бит знака. –
Ваш вопрос мне непонятен. –