← Назад к вопросам

В чем разница между int и uint в Go?

1.3 Junior🔥 172 комментариев
#Основы Go

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между int и uint в Go

В языке Go типы int и uint являются основными целочисленными типами, но имеют принципиальную разницу в представлении чисел.

Основное отличие: знаковость

Ключевое различие заключается в знаковости:

  • int (integer) — знаковый целочисленный тип. Может хранить положительные, отрицательные числа и нуль.
  • uint (unsigned integer) — беззнаковый целочисленный тип. Может хранить только положительные числа и нуль.
var x int = -10   // Допустимо для int
var y uint = -10  // Ошибка компиляции: constant -10 overflows uint

Представление в памяти и диапазон значений

Оба типа имеют одинаковый размер в памяти, но разный диапазон из-за знакового бита:

  • Для int: один бит используется для знака (0 — положительное, 1 — отрицательное)
  • Для uint: все биты используются для значения

Для стандартных 64-битных систем (int64/uint64):

int:  от -2^63 до 2^63 - 1 (-9,223,372,036,854,775,808 до 9,223,372,036,854,775,807)
uint: от 0 до 2^64 - 1 (0 до 18,446,744,073,709,551,615)

Размер конкретного типа зависит от архитектуры системы:

// int и uint имеют размер 32 или 64 бита в зависимости от платформы
fmt.Println("Размер int:", unsafe.Sizeof(int(0))) // 8 байт на 64-bit, 4 на 32-bit
fmt.Println("Размер uint:", unsafe.Sizeof(uint(0))) // Аналогично

Практические примеры использования

Когда использовать int:

  1. Общие математические операции, особенно с отрицательными числами
  2. Счетчики, которые могут уменьшаться ниже нуля
  3. Индексы и разности, где результат может быть отрицательным
  4. Большинство стандартных вычислений (более безопасно)
temperature := -5 // Отрицательная температура
balance := -100   // Долг/дефицит
delta := x - y    // Разность может быть отрицательной

Когда использовать uint:

  1. Битовые операции и маски
  2. Системные значения (PID, флаги, хэши)
  3. Коллекции, где размер гарантированно не отрицательный
  4. Специфические области (графика, сетевые пакеты)
var mask uint = 0xFF        // Битовые маски
var fileSize uint = 1024    // Размер файла (не может быть отрицательным)
var colorRGB uint32 = 0xFFFFFF // Цвет в RGB формате

Особенности и подводные камни

Переполнение и неявное преобразование

Go строго контролирует типы. Нельзя смешивать int и uint без явного преобразования:

var a int = 10
var b uint = 20

// sum := a + b  // Ошибка: несовпадение типов
sum := a + int(b) // Правильно: явное преобразование

Сравнение и операции

Операции сравнения между int и uint также требуют преобразования:

if uint(a) > b {  // Необходимо преобразование
    fmt.Println("a больше b")
}

Опасность uint для вычитания

При вычитании uint значений может возникнуть переполнение:

var x uint = 5
var y uint = 10
result := x - y  // Получится очень большое число (переполнение), не ошибка!
fmt.Println(result) // На 64-bit: 18446744073709551611

Целочисленные константы

Целочисленные константы в Go имеют "неопределенный тип" и могут использоваться с любым целочисленным типом:

const value = 100 // Константа без типа
var i int = value // Можно присвоить int
var u uint = value // Можно присвоить uint

Выбор типа в практике разработки

Рекомендации:

  • Преимущественно используйте int для большинства случаев — это безопаснее и предотвращает ошибки с отрицательными значениями.
  • Используйте uint только когда необходимо и есть гарантия отсутствия отрицательных значений.
  • Для специфичных размеров используйте явные типы: int8, int16, int32, int64 и их беззнаковые варианты.
  • Помните о платформенной зависимости int/uint — если нужна конкретная размерность, используйте типы с фиксированным размером.
// Лучшая практика: явные размеры для кросс-платформенной совместимости
var id int64 = 1000      // Знаковый, 64 бита всегда
var size uint32 = 1024   // Беззнаковый, 32 бита всегда

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

В чем разница между int и uint в Go? | PrepBro