Ответ
В типе Int32 (32-битное целое число со знаком) старший (самый левый) бит является знаковым битом (sign bit). Это следствие использования представления чисел в форме дополнительного кода (two's complement).
Принцип работы:
- Знаковый бит = 0: Число положительное или ноль. Остальные 31 бит хранят абсолютное значение числа в обычном двоичном виде.
- Знаковый бит = 1: Число отрицательное. Остальные 31 бит хранят значение, полученное путем инверсии битов абсолютного значения числа и прибавления единицы.
Примеры (в упрощенном 8-битном виде для наглядности, Int8):
let positive: Int8 = 42 // Двоичное: 00101010 (знаковый бит = 0)
let zero: Int8 = 0 // Двоичное: 00000000
let negative: Int8 = -42 // Двоичное: 11010110
// (это 42 (00101010) -> инверсия (11010101) -> +1 (11010110))
Последствия:
- Диапазон значений: Из-за резервирования одного бита под знак, диапазон
Int32смещен: от -2,147,483,648 (Int32.min) до 2,147,483,647 (Int32.max). - Сравнение с UInt32: У беззнакового типа
UInt32все 32 бита используются для значения, поэтому его диапазон: от 0 до 4,294,967,295. - Проверка знака: Можно быстро определить знак числа, проверив старший бит с помощью побитовой операции
(number & 0x80000000) != 0.
Ключевой вывод: Старший бит в Int32 не «не используется» — он критически важен для представления знака числа и определения его значения в рамках системы дополнительного кода.
Ответ 18+ 🔞
Так, слушай, про этот ваш Int32... Ну, тип целочисленный, 32 бита, со знаком. Так вот, самый левый бит, старший, он у нас тут не просто так болтается, а работает знаковым битом, сука. Это всё из-за того, что числа хранятся в форме дополнительного кода, ёпта.
Как это, блядь, работает:
- Знаковый бит = 0: Число либо положительное, либо ноль. Остальные 31 бит — это просто значение, как есть, в двоичном виде.
- Знаковый бит = 1: Число отрицательное, пипец. А оставшиеся 31 бит — это уже не просто значение, а результат такой ебанистики: берём модуль числа, инвертируем все его биты, а потом ещё и единичку прибавляем. Вот такая, блядь, арифметика.
*Примеры, чтобы не ебть мозг (возьмём Int8 для наглядности, там короче):**
let positive: Int8 = 42 // Двоичное: 00101010 (знаковый бит, сука, = 0)
let zero: Int8 = 0 // Двоичное: 00000000
let negative: Int8 = -42 // Двоичное: 11010110
// Это ж 42 (00101010) -> инверсия (11010101) -> +1 (11010110), вот и вся магия, блядь!
И что из этого, нахуй, вытекает:
- Диапазон значений: Раз один бит на знак ушёл, то и диапазон кривой получается.
Int32может от -2,147,483,648 (Int32.min) до 2,147,483,647 (Int32.max). Несимметрично, да, но так уж этот дополнительный код устроен, в рот его чих-пых. - Сравниваем с
UInt32: А вот у его беззнакового брата,UInt32, все 32 бита — на значение! Поэтому он может от 0 до 4,294,967,295. Овердохуища, да? - Проверка знака: Если надо быстро понять, отрицательное число или нет, можно старший бит побитовой операцией проверить:
(number & 0x80000000) != 0. Если не ноль — минус, пизда.
Ключевой вывод, блядь: Старший бит в Int32 — он не просто так, не «запасной». Он, сука, критически важен! Именно он и определяет знак, и всё значение числа через эту систему дополнительного кода выстраивается. Без него — нихуя не работает.