Переполнение в Kotlin
Давайте теперь посмотрим, что происходит в памяти, когда однобайтовое число выходит за верхний край.
В памяти число лежит в двоичном виде. Каждая клетка
такой записи - бит, и в ней только 0 или
1. Восемь бит составляют один байт, а тип
Byte занимает как раз один байт.
Правый бит означает единицы. Каждый шаг влево
удваивает вес бита: 1, 2, 4,
8, 16, 32, 64,
128. Единица в бите добавляет его вес,
ноль ничего не добавляет.
Число 1 записывают как 00000001:
единица стоит только в правом бите. Число
2 - это 00000010: единица перешла
на один бит влево, правый бит стал нулем.
Число 3 - это 00000011, то есть
2 + 1.
Смена одного бита меняет число на вес этого бита.
В записи 00000101 единицы стоят на весах
4 и 1, вместе это 5. Если
бит веса 4 заменить нулем, останется
00000001, то есть 1.
Если во всех восьми битах стоит единица, запись
выглядит как 11111111. Сложим веса слева
направо: 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1.
Получается 255. Это самое большое число
в одном байте без знака.
У типа Byte нужен знак, и левый бит забирают
под него. Ноль в этом бите оставляет число среди
нуля и положительных. На само число остаются семь
бит. Их максимум - 01111111, то есть
64 + 32 + 16 + 8 + 4 + 2 + 1, число
127.
Прибавим к 127 единицу. Сложение идет по
битам, как в столбик. Семь единиц становятся
нулями, перенос падает в левый бит. Получается
10000000.
Левый бит стал единицей, остальные нули. Эта
комбинация уже занята числом -128.
Отдельного места для 128 нет: все
256 комбинаций разобраны. Поэтому
в Byte после 127 идет -128.
Само сложение двух Byte идет в типе Int.
Там 127 + 1 равно 128. Функция
toByte оставляет только последние 8 бит.
Это как раз 10000000, то есть -128:
var num1: Byte = 127
num1 = (num1 + 1).toByte()
println(num1) // -128
С другой стороны те же восемь бит замыкаются в кольцо.
-128 записано как 10000000. Если отнять
единицу, перенос идет в обратную сторону и остается
01111111, то есть 127:
var num1: Byte = -128
num1 = (num1 - 1).toByte()
println(num1) // 127
Дана переменная:
var num1: Byte = 126
Прибавьте 2, запишите результат в эту же
переменную и выведите ее.
Дана переменная:
var num1: Byte = 124
Прибавьте 5, запишите результат в эту же
переменную и выведите ее.
Дана переменная:
var num1: Byte = 127
Прибавьте 3, запишите результат в эту же
переменную и выведите ее.
Дана переменная:
var num1: Byte = -128
Отнимите 1, запишите результат в эту же
переменную и выведите ее.