char
может быть подписанным или неподписанным, в зависимости от вашего компилятора.
В вашем случае он, кажется, подписан, а 255 находится вне диапазона, который он может представлять (вероятно, он может представлять только числа от -128 до 127).
Таким образом, проблема возникает, когда вы присваиваете 255 переменной char
- это приводит к определенному реализацией значению, которое в вашем случае будет равно -1.
Когда вы умножаете -1 на 2, вы получаете -2. Там нет никакой тайны. Приведение к (int)
ничего не делает - типы, более узкие, чем int
, всегда переводятся в int
или unsigned int
до того, как с ними будут выполнены любые вычисления.