Очень вероятно, не пытается сдвинуться на какое-то большое количество бит.
INT_MAX
в вашей системе равно , вероятно 2**31-1
или 0x7fffffff
(я использую **
для обозначения возведения в степень). Если это так, то в декларации:
int b = 0x80000000;
(в вопросе отсутствовала точка с запятой; пожалуйста, скопируйте и вставьте свой точный код) константа 0x80000000
имеет тип unsigned int
, а не int
. Значение неявно преобразуется в int
. Поскольку результат находится за пределами int
, результат определяется реализацией (или в C99 может вызвать сигнал, определяемый реализацией, но я не знаю какой-либо реализации, которая это делает).
Самый распространенный способ сделать это - переосмыслить биты беззнакового значения как значение со знаком 2-дополнения. Результат в этом случае -2**31
или -2147483648
.
То есть поведение не определено, потому что вы перемещаетесь на значение, равное или превышающее ширину типа int
, оно не определено, потому что вы перемещаетесь на (очень большое) отрицательное значение .
Не то, чтобы это имело значение, конечно; undefined является неопределенным.
ПРИМЕЧАНИЕ. Выше указано, что int
- это 32 бита в вашей системе. Если int
шире, чем 32 бита, то большая его часть не применяется (но поведение все еще не определено).
Если вы действительно хотите попытаться сдвинуться на 0x80000000
бит, вы можете сделать это следующим образом:
unsigned long b = 0x80000000;
unsigned long a = 1 >> b; // *still* undefined
unsigned long
гарантированно будет достаточно большим, чтобы содержать значение 0x80000000
, поэтому вы избежите части проблемы.
Конечно, поведение сдвига столь же неопределенно, как и в исходном коде, поскольку 0x80000000 больше или равно ширине unsigned long
. (Если ваш компилятор не имеет действительно большой unsigned long
типа, но никакой реальный компилятор не делает этого.)
Единственный способ избежать неопределенного поведения - не делать то, что вы пытаетесь сделать.
Возможно , но невероятно маловероятно, , что поведение вашего исходного кода не является неопределенным. Это может произойти, только если определенное реализацией преобразование 0x80000000
из unsigned int
в int
дает значение в диапазоне 0 .. 31. Если IF int
меньше 32 бит, преобразование, скорее всего, даст 0 .