Тип int16

Тип int16 в Go представляет 16-разрядное целое число со знаком. Он занимает 2 байта (16 бит) памяти и может хранить значения в диапазоне от -32768 до 32767. Этот тип часто используется для экономии памяти при работе с небольшими числами, а также при взаимодействии с внешними системами, где требуется строго определенный размер данных.

Диапазон значений

Тип int16 имеет фиксированный диапазон значений. Давайте выведем минимальное и максимальное значение с помощью констант пакета math:

gopackage main

import (
  "fmt"
  "math"
)

func main() {
  fmt.Printf("Min: %d\n", math.MinInt16)
  fmt.Printf("Max: %d\n", math.MaxInt16)
}

Результат выполнения кода:

go"Min: -32768"
"Max: 32767"

Как видно из примера, int16 может хранить числа в указанном диапазоне. Попытка присвоить значение выходящее за пределы диапазона приведет к ошибке на этапе компиляции или переполнению.

Объявление переменной

Переменную типа int16 можно объявить несколькими способами: явно указав тип, с помощью короткой записи, или с использованием литералов разных систем счисления:

gopackage main

import "fmt"

func main() {
  var num1 int16 = 10000
  num2 := int16(5000)
  var num3 int16
  hexNum := int16(0x7FFF)
  octNum := int16(077777)

  fmt.Println(num1)
  fmt.Println(num2)
  fmt.Println(num3)
  fmt.Println(hexNum)
  fmt.Println(octNum)
}

Результат выполнения кода:

go"10000"
"5000"
"0"
"32767"
"32767"

Обратите внимание, что переменная num3 получает нулевое значение по умолчанию для типа int16.

Арифметические операции

С типом int16 можно выполнять все стандартные арифметические операции: сложение, вычитание, умножение, деление и взятие остатка:

gopackage main

import "fmt"

func main() {
  a := int16(100)
  b := int16(25)

  res1 := a + b
  res2 := a - b
  res3 := a * b
  res4 := a / b
  res5 := a % b

  fmt.Println(res1)
  fmt.Println(res2)
  fmt.Println(res3)
  fmt.Println(res4)
  fmt.Println(res5)
}

Результат выполнения кода:

go"125"
"75"
"2500"
"4"
"0"

При выполнении арифметических операций важно помнить, что результат не должен выходить за пределы диапазона значений типа int16.

Переполнение

При выходе за пределы допустимого диапазона возникает переполнение. В Go переполнение для целочисленных типов происходит без предупреждения, значение "зацикливается":

gopackage main

import "fmt"

func main() {
  var num int16 = 32767
  num++

  fmt.Println(num)
}

Результат выполнения кода:

go"-32768"

Как видите, при увеличении максимального значения на единицу происходит переход к минимальному значению. Аналогично происходит при выходе за минимальное значение.

Преобразование типов

Тип int16 можно преобразовывать к другим целочисленным типам с помощью явного приведения. Важно следить, чтобы значение помещалось в целевой тип:

gopackage main

import "fmt"

func main() {
  var a int16 = 1000

  b := int32(a)
  c := int(a)
  d := int8(a)

  fmt.Println(b)
  fmt.Println(c)
  fmt.Println(d)
}

Результат выполнения кода:

go"1000"
"1000"
"232"

При преобразовании int16 в int8 происходит обрезание старших битов, что может привести к неожиданным результатам, как в примере выше.

Сравнение чисел

Значения типа int16 можно сравнивать между собой с использованием операторов сравнения:

gopackage main

import "fmt"

func main() {
  a := int16(100)
  b := int16(200)
  c := int16(100)

  fmt.Println(a == b)
  fmt.Println(a != b)
  fmt.Println(a < b)
  fmt.Println(a > b)
  fmt.Println(a <= b)
  fmt.Println(a >= b)
  fmt.Println(a == c)
}

Результат выполнения кода:

go"false"
"true"
"true"
"false"
"true"
"false"
"true"

Операторы сравнения возвращают логическое значение bool и позволяют проверять отношения между числами.

Работа с вводом-выводом

Тип int16 часто используется для чтения данных из бинарных файлов или сетевых протоколов, где требуется строго определенный размер. Пример чтения числа из байтового среза:

gopackage main

import (
  "encoding/binary"
  "fmt"
)

func main() {
  bytes := []byte{0x01, 0x00}
  num := binary.LittleEndian.Uint16(bytes)
  numInt16 := int16(num)

  fmt.Printf("Bytes: %v\n", bytes)
  fmt.Printf("Uint16: %d\n", num)
  fmt.Printf("Int16: %d\n", numInt16)
}

Результат выполнения кода:

go"Bytes: [1 0]"
"Uint16: 1"
"Int16: 1"

Для корректной работы с бинарными данными используйте пакет encoding/binary, который позволяет контролировать порядок байтов.

Смотрите также

  • тип int,
    который представляет целое число со знаком размером в зависимости от архитектуры
  • тип int8,
    который представляет 8-разрядное целое число со знаком
  • тип int32,
    который представляет 32-разрядное целое число со знаком
  • тип int64,
    который представляет 64-разрядное целое число со знаком