Целые числа (Integers)
Целые числа можно разделить на две категории: беззнаковые целые числа (unsigned integers) и знаковые целые числа (signed integers). Знаковые целые числа используются наиболее широко.
Беззнаковое (Unsigned) означает, что оно может представлять только неотрицательные числа (0 и положительные числа), в то время как знаковые числа (signed numbers) могут представлять как отрицательные, так и неотрицательные числа.
Беззнаковые целые числа можно разделить на четыре размера: 8 бит, 16 бит, 32 бита и 64 бита, представленные соответственно uint8, uint16, uint32 и uint64. Соответствующие знаковые целые числа: int8, int16, int32 и int64. В следующей таблице показаны различные диапазоны, представленные каждым типом:
| Тип |
Описание |
Диапазон |
| uint8 |
8-битное беззнаковое int |
от 0 до 255 |
| int8 |
8-битное знаковое int |
от -128 до 127 |
| uint16 |
16-битное беззнаковое int |
от 0 до 65535 |
| int16 |
16-битное знаковое int |
от -32768 до 32767 |
| uint32 |
32-битное беззнаковое int |
от 0 до 4294967295 |
| int32 |
32-битное знаковое int |
от -2147483648 до 2147483647 |
| uint64 |
64-битное беззнаковое int |
от 0 до 18446744073709551615 |
| int64 |
64-битное знаковое int |
от -9223372036854775808 до 9223372036854775807 |
Возьмем в качестве примера uint8 и int8. Они оба являются 8-битными целыми числами и могут представлять 256 значений. В беззнаковом целочисленном типе uint8 диапазон, который он может представлять, составляет от 0 до 255, в то время как в знаковом целочисленном типе int8 диапазон, который он может представлять, составляет от -128 до 127.
В дополнение к вышеуказанным 8 типам существуют три других специальных целочисленных типа: uint, int и uintptr, где uint и int могут представлять разные диапазоны на разных платформах, а uintptr используется для хранения адресов указателей (pointer addresses).
| Тип |
Диапазон |
uint |
uint32 в 32-битных системах, uint64 в 64-битных системах |
int |
int32 в 32-битных системах, int64 в 64-битных системах |
uintptr |
Беззнаковый целочисленный тип, используемый для хранения адресов указателей (pointer addresses), в основном используется в низкоуровневом программировании, таком как небезопасные операции (unsafe operations) |
Теперь давайте создадим файл с именем integer.go, чтобы продемонстрировать использование целых чисел:
cd ~/project
touch integer.go
package main
import (
"fmt"
"unsafe"
)
func main() {
// View the type of int in the current environment
// Declare a as the type int
var a int
// Use unsafe.Sizeof() to output the memory size occupied by the type
fmt.Printf("The type int in the current environment is %d bits\n", unsafe.Sizeof(a)*8)
var b int8 = 125
// Use the %d placeholder in fmt.Printf to output the value of the integer
// Use the %T placeholder in fmt.Printf to output the type of the variable
fmt.Printf("The value of b is %d, and the type is %T\n", b, b)
// Integer operations
// Declare integers c and d, and calculate their sum
c, d := 2, 3
fmt.Printf("c + d = %d\n", c+d)
// 10 - 5
fmt.Printf("10 - 5 = %d\n", 10-5)
// 8 * 10
fmt.Printf("8 * 10 = %d\n", 8*10)
// Example of uintptr usage - storing an address
var ptr uintptr
x := 42
// Convert the pointer to x to uintptr
ptr = uintptr(unsafe.Pointer(&x))
fmt.Printf("The address of x stored in ptr is: %v\n", ptr)
}
После выполнения программы мы получим следующий вывод:
go run integer.go
The type int in the current environment is 64 bits
The value of b is 125, and the type is int8
c + d = 5
10 - 5 = 5
8 * 10 = 80
The address of x stored in ptr is: 824634818784
Объяснение вывода:
The type int in the current environment is 64 bits: Эта строка показывает, что тип int в системе, где выполняется код, составляет 64 бита (или 8 байт), что указывает на то, что это int64. unsafe.Sizeof(a) возвращает размер переменной a в байтах, а умножение на 8 преобразует его в биты. Это означает, что тип int может содержать большие целочисленные значения.
The value of b is 125, and the type is int8: Здесь мы объявили переменную b типа int8 и присвоили ей значение 125. Вывод подтверждает это, показывая как значение, так и тип данных.
c + d = 5, 10 - 5 = 5, 8 * 10 = 80: Эти строки демонстрируют основные арифметические операции с целыми числами: сложение, вычитание и умножение. Вывод подтверждает правильные результаты этих вычислений.
The address of x stored in ptr is: 824634818784: Это демонстрирует, как uintptr можно использовать для хранения адреса памяти. Мы преобразуем указатель на целочисленную переменную x в тип uintptr. Фактическое значение адреса будет меняться каждый раз при запуске программы. Это продвинутый вариант использования, обычно встречающийся в небезопасных операциях (unsafe operations) и системном программировании.
В этом файле функция unsafe.Sizeof() может использоваться для получения количества байтов, занимаемых текущим типом переменной. 1 байт (byte) равен 8 битам, поэтому unsafe.Sizeof()*8 может получить количество битов, занимаемых типом. Из вывода мы видим, что онлайн-среда составляет 64 бита. Фактический тип int в онлайн-среде — int64.
Мы можем использовать следующую команду в терминале, чтобы определить текущую архитектуру системы:
dpkg --print-architecture
amd64