Назад к вопросам
Junior
322
questionbank

В чем отличие между типами uint и int в языке Go?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Типы uint и int в Go представляют собой целочисленные типы данных, но отличаются по диапазону представимых значений и их смыслу (знаковые/беззнаковые).

int (знаковое целое):

  • Может хранить как положительные, так и отрицательные числа, а также ноль.
  • Размер в битах (и, соответственно, диапазон) зависит от архитектуры компьютера (32 или 64 бита). На 32-битной архитектуре это 32 бита, на 64-битной - 64 бита.
  • Диапазон: от -2<sup>n-1</sup> до 2<sup>n-1</sup> - 1, где n - количество бит.

uint (беззнаковое целое):

  • Может хранить только неотрицательные числа, начиная от нуля.
  • Размер в битах также зависит от архитектуры компьютера (32 или 64 бита) и соответствует размеру int.
  • Диапазон: от 0 до 2<sup>n</sup> - 1, где n - количество бит.

Основное отличие в том, что int использует один бит для представления знака (положительное или отрицательное число), тогда как uint все биты использует для представления величины числа. Это дает uint возможность хранить вдвое больший максимальный положительный диапазон по сравнению с int такого же размера.

При выборе между int и uint следует учитывать:

  • Предполагается ли, что число может быть отрицательным. Если да, используйте int.
  • Необходим ли максимальный положительный диапазон. Если да и отрицательные значения не нужны, возможно, подходит uint.
  • Тип uint часто используется для представления битовых масок, идентификаторов, размеров или количеств, которые по своей природе не могут быть отрицательными.
// int может быть отрицательным
var signedInt int = -10
// uint не может быть отрицательным
// var unsignedInt uint = -10 // Ошибка компиляции

// Максимальные значения (на 64-битной системе)
// fmt.Println(math.MaxInt64)  // 9223372036854775807
// fmt.Println(math.MaxUint64) // 18446744073709551615 (примерно вдвое больше)

// Неявное преобразование невозможно между int и uint
var a int = 5
var b uint = 5
// if a == b { ... } // Ошибка: несоответствие типов без явного преобразования

// Явное преобразование
var c int = 10
var d uint = uint(c)

var e uint = 20
var f int = int(e)