Тип uint64

Тип uint64 представляет собой 64-битное целое число без знака. Он может хранить значения в диапазоне от 0 до 18446744073709551615. Этот тип часто используется для работы с большими числами, идентификаторами, битовыми масками, хеш-суммами и в системном программировании. В отличие от знаковых типов, uint64 не может хранить отрицательные значения, что гарантирует, что все операции с ним будут выполняться с неотрицательными числами.

Объявление переменных

Объявим переменную типа uint64 с использованием явного указания типа:

gopackage main

import "fmt"

func main() {
  var num uint64 = 100500
  fmt.Println(num)
}

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

go100500

Также можно использовать короткую форму объявления без указания типа, если Go может вывести его из контекста:

gopackage main

import "fmt"

func main() {
  num := uint64(123456789)
  fmt.Println(num)
}

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

go123456789

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

Максимальное значение для типа uint64 можно получить с помощью константы math.MaxUint64 из пакета math:

gopackage main

import (
  "fmt"
  "math"
)

func main() {
  fmt.Println(math.MaxUint64)
}

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

go18446744073709551615

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

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

С переменными типа uint64 можно выполнять стандартные арифметические операции: сложение, вычитание, умножение и деление. Результат операции всегда будет типа uint64, если оба операнда имеют этот тип:

gopackage main

import "fmt"

func main() {
  a := uint64(1000000)
  b := uint64(2000000)

  sum := a + b
  diff := b - a
  prod := a * b
  quot := b / a

  fmt.Println(sum, diff, prod, quot)
}

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

go3000000 1000000 2000000000000 2

При сложении двух чисел uint64 важно помнить о возможном переполнении. Если результат сложения превышает math.MaxUint64, происходит переполнение и результат вычисляется по модулю 2^64:

gopackage main

import (
  "fmt"
  "math"
)

func main() {
  a := math.MaxUint64
  b := uint64(1)

  res := a + b
  fmt.Println(res)
}

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

go0

Битовые операции

Тип uint64 поддерживает все битовые операции: побитовое И, ИЛИ, исключающее ИЛИ, сдвиги влево и вправо. Это делает его удобным для работы с битовыми масками и низкоуровневым программированием:

gopackage main

import "fmt"

func main() {
  a := uint64(0b1010) // 10 в десятичной
  b := uint64(0b1100) // 12 в десятичной

  and := a & b
  or := a | b
  xor := a ^ b
  shiftLeft := a << 2
  shiftRight := a >> 1

  fmt.Println(and, or, xor, shiftLeft, shiftRight)
}

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

go8 14 6 40 5

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

Для преобразования uint64 в другие числовые типы используется явное приведение. При преобразовании в меньший тип (например, uint32) старшие биты будут отброшены:

gopackage main

import "fmt"

func main() {
  var num uint64 = 123456789012345
  var num32 uint32 = uint32(num)
  var numFloat float64 = float64(num)

  fmt.Println(num32, numFloat)
}

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

go404232601 123456789012345

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

  • тип int64,
    который хранит 64-битные целые числа со знаком
  • тип uint32,
    который хранит 32-битные целые числа без знака
  • тип uint,
    который имеет размер, зависящий от архитектуры
  • тип uintptr,
    который предназначен для хранения указателей