Тип uint64
Тип uint64 представляет собой 64-битное целое число без знака.
Он может хранить значения в диапазоне от 0 до 18446744073709551615.
Этот тип часто используется для работы с большими числами, идентификаторами,
битовыми масками, хеш-суммами и в системном программировании.
В отличие от знаковых типов, uint64 не может хранить отрицательные значения,
что гарантирует, что все операции с ним будут выполняться с неотрицательными числами.
Объявление переменных
Объявим переменную типа uint64 с использованием явного указания типа:
package main
import "fmt"
func main() {
var num uint64 = 100500
fmt.Println(num)
}
Результат выполнения кода:
100500
Также можно использовать короткую форму объявления без указания типа, если Go может вывести его из контекста:
package main
import "fmt"
func main() {
num := uint64(123456789)
fmt.Println(num)
}
Результат выполнения кода:
123456789
Диапазон значений
Максимальное значение для типа uint64 можно получить с помощью константы
math.MaxUint64 из пакета math:
package main
import (
"fmt"
"math"
)
func main() {
fmt.Println(math.MaxUint64)
}
Результат выполнения кода:
18446744073709551615
Попытка присвоить значение, превышающее максимальное, приведет к ошибке компиляции, поскольку литерал выходит за пределы допустимого диапазона.
Арифметические операции
С переменными типа uint64 можно выполнять стандартные арифметические операции:
сложение, вычитание, умножение и деление. Результат операции всегда будет типа
uint64, если оба операнда имеют этот тип:
package 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)
}
Результат выполнения кода:
3000000 1000000 2000000000000 2
При сложении двух чисел uint64 важно помнить о возможном переполнении.
Если результат сложения превышает math.MaxUint64, происходит переполнение
и результат вычисляется по модулю 2^64:
package main
import (
"fmt"
"math"
)
func main() {
a := math.MaxUint64
b := uint64(1)
res := a + b
fmt.Println(res)
}
Результат выполнения кода:
0
Битовые операции
Тип uint64 поддерживает все битовые операции: побитовое И, ИЛИ, исключающее ИЛИ,
сдвиги влево и вправо. Это делает его удобным для работы с битовыми масками и
низкоуровневым программированием:
package 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)
}
Результат выполнения кода:
8 14 6 40 5
Преобразование типов
Для преобразования uint64 в другие числовые типы используется явное приведение.
При преобразовании в меньший тип (например, uint32) старшие биты будут отброшены:
package main
import "fmt"
func main() {
var num uint64 = 123456789012345
var num32 uint32 = uint32(num)
var numFloat float64 = float64(num)
fmt.Println(num32, numFloat)
}
Результат выполнения кода:
404232601 123456789012345