Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗ktPmCvOv 63 of 522 menu
◀ ▶

Переполнение в 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, запишите результат в эту же переменную и выведите ее.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить