Уже ваша отправная точка проблематична:
char c = 0x80;
Если (как, по-видимому, в вашем случае) char
является типом со знаком, вы присваиваете целочисленную константу 128
типу, который гарантированно будет содержать значения только до 127
. Затем ваш компилятор может выбрать какое-то определенное для реализации значение (в моем случае -128
) или выдать ошибку диапазона.
Затем вы выполняете сдвиг влево на это отрицательное значение. Это дает неопределенное поведение. Всего у вас есть несколько вариантов реализации, определенных плюс поведение, определяющее результат:
- подпись
char
- выбор способа конвертации
128
в signed char
- ширина
char
- знаковое представление
int
(есть три варианта)
- выбор того, как реализовать (или нет) сдвиг влево на минус
int
Это может быть хорошим упражнением для вас, чтобы посмотреть все эти случаи и посмотреть, каковы могут быть различные результаты.
В заключение некоторые рекомендации:
- выберите подходящую константу для инициализации переменной
- не делайте арифметику с простым
char
- не делать сдвиг влево на типах со знаком