Оператор &* - переполняющее умножение (overflowing multiplication).
&*:
• игнорирует переполнение;
• выполняет умножение по модулю диапазона типа;
• не вызывает runtime error.
___
Для Int8 диапазон: -128...127
Общая формула: result = (a * b) mod 2^N
mod - остаток от деления (%), но не может быть отрицательным.
Числа, выходящие за пределы, оборачиваются по модулю 256 (2^8).
Наглядно
0000_0000 - 0
0000_0001 - 1
...
0111_1111 - 127
1000_0000 - -128
1000_0001 - -127
...
1111_1111 - -1
опять 0000_0000 - 0
32 * 4 = 128
128 не помещается в Int8.
Битовый паттерн зарезервирован под -128.
&*:
• игнорирует переполнение;
• выполняет умножение по модулю диапазона типа;
• не вызывает runtime error.
___
Для Int8 диапазон: -128...127
Общая формула: result = (a * b) mod 2^N
mod - остаток от деления (%), но не может быть отрицательным.
Числа, выходящие за пределы, оборачиваются по модулю 256 (2^8).
Наглядно
0000_0000 - 0
0000_0001 - 1
...
0111_1111 - 127
1000_0000 - -128
1000_0001 - -127
...
1111_1111 - -1
опять 0000_0000 - 0
32 * 4 = 128
128 не помещается в Int8.
Битовый паттерн зарезервирован под -128.