Как показано в другом ответе, в отличие от некоторых других языков программирования, Go обрабатывает все целочисленные переполнения четко определенным образом, аналогично тому, что происходит в большинстве современных процессоров на уровне сборки.
127= 0111 1111 двоичное
, что + 1 = 1000 0000 двоичное
, которое интерпретируется как 8-разрядное целое число со знаком двоичного числа со знаком 2, равно -128.
255 = 1111 1111 двоичное
, что + 1 = 1 0000 0000 двоичное (примечание 9 бит)
Это было бы 256, если бы у нас было 9 бит, но у нас нет, у нас есть только 8, поэтому он становится 0000 0000двоичный файл, который равен 0.
Аналогично для умножения:
127 * 127 = 16129 = 0011 1111 0000 0001 bin
255 * 255 = 65025 =1111 1110 0000 0001 bin
Оба имеют младшие 8 битов, как 0000 0001 bin = 1
Примечание: большую часть времени, если вы полагаетесь на целочисленное переполнение, вы должнысделайте шаг назад и подумайте, если это лучший способ сделать то, что вы делаете.Это поведение очень низкого уровня, включающее точное побитовое поведение и всегда должно сопровождаться достаточным количеством комментариев, объясняющих, что и почему.