Как используется старший бит в 32-битном целочисленном типе Int32?

Ответ

В типе 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))

Последствия:

  1. Диапазон значений: Из-за резервирования одного бита под знак, диапазон Int32 смещен: от -2,147,483,648 (Int32.min) до 2,147,483,647 (Int32.max).
  2. Сравнение с UInt32: У беззнакового типа UInt32 все 32 бита используются для значения, поэтому его диапазон: от 0 до 4,294,967,295.
  3. Проверка знака: Можно быстро определить знак числа, проверив старший бит с помощью побитовой операции (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), вот и вся магия, блядь!

И что из этого, нахуй, вытекает:

  1. Диапазон значений: Раз один бит на знак ушёл, то и диапазон кривой получается. Int32 может от -2,147,483,648 (Int32.min) до 2,147,483,647 (Int32.max). Несимметрично, да, но так уж этот дополнительный код устроен, в рот его чих-пых.
  2. Сравниваем с UInt32: А вот у его беззнакового брата, UInt32, все 32 бита — на значение! Поэтому он может от 0 до 4,294,967,295. Овердохуища, да?
  3. Проверка знака: Если надо быстро понять, отрицательное число или нет, можно старший бит побитовой операцией проверить: (number & 0x80000000) != 0. Если не ноль — минус, пизда.

Ключевой вывод, блядь: Старший бит в Int32 — он не просто так, не «запасной». Он, сука, критически важен! Именно он и определяет знак, и всё значение числа через эту систему дополнительного кода выстраивается. Без него — нихуя не работает.