Как можно переключить unsigned int на отрицательное число с битовым сдвигом?

Почему я получаю отрицательное число при выполнении этого?

unsigned int a = 1 << 31;
printf("%d",a);

Я уже проверил размер целого числа на моем компьютере и это 4 байта. Таким образом, мое целое число состоит из 32 бит и делает 31 сдвиг влево, я должен получить до самого значительного бита. Это означает, что это должно быть положительное число, но я всегда получаю отрицательный результат.

Что я получаю: -2147483648

Что я ожидал: некоторое положительное число (возможно, 1073741824)

Что мне здесь не хватает?

0
источник поделиться
3 ответа

Проблема заключается не в том, что вы немного смещаетесь. Вы просто не печатаете в соответствующем формате.

% d или% я для печати int, и, таким образом, когда вы пытаетесь напечатать свой unsigned int, он преобразуется в подписанный int.

См. Здесь: Что такое спецификатор формата для unsigned short int?

или https://www.le.ac.uk/users/rjm1/cotter/page_30.htm

0
источник

Используйте% u в качестве строки формата printf.

Имея в виду:

printf("%u",a);
0
источник

В дополнение к неправильному спецификатору формата, который вы используете (%d вместо %u), вы, вероятно, вызываете неопределенное поведение, перемещая 1 в знаковый бит операнда int, как указано в этом ответе.
Чтобы исправить это, используйте неподписанный литерал:

unsigned int a = 1u << 31;
//                ^
0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос