Inteiros
Os inteiros podem ser amplamente divididos em duas categorias: inteiros sem sinal (unsigned integers) e inteiros com sinal (signed integers). Os inteiros com sinal são os mais amplamente utilizados.
Sem sinal (unsigned) significa que pode representar apenas números não negativos (0 e números positivos), enquanto os números com sinal (signed) podem representar números negativos e não negativos.
Os inteiros sem sinal podem ser divididos em quatro tamanhos: 8 bits, 16 bits, 32 bits e 64 bits, representados por uint8, uint16, uint32 e uint64, respectivamente. Os inteiros com sinal correspondentes são int8, int16, int32 e int64. A tabela a seguir mostra as diferentes faixas representadas por cada tipo:
| Tipo |
Descrição |
Faixa |
| uint8 |
Inteiro sem sinal de 8 bits |
0 a 255 |
| int8 |
Inteiro com sinal de 8 bits |
-128 a 127 |
| uint16 |
Inteiro sem sinal de 16 bits |
0 a 65535 |
| int16 |
Inteiro com sinal de 16 bits |
-32768 a 32767 |
| uint32 |
Inteiro sem sinal de 32 bits |
0 a 4294967295 |
| int32 |
Inteiro com sinal de 32 bits |
-2147483648 a 2147483647 |
| uint64 |
Inteiro sem sinal de 64 bits |
0 a 18446744073709551615 |
| int64 |
Inteiro com sinal de 64 bits |
-9223372036854775808 a 9223372036854775807 |
Vamos tomar uint8 e int8 como exemplos. Ambos são inteiros de 8 bits e podem representar 256 valores. No tipo de inteiro sem sinal uint8, a faixa que ele pode representar é de 0 a 255, enquanto no tipo de inteiro com sinal int8, a faixa que ele pode representar é de -128 a 127.
Além dos 8 tipos acima, existem três outros tipos de inteiros especiais, uint, int e uintptr, onde uint e int podem representar diferentes faixas em diferentes plataformas, e uintptr é usado para armazenar endereços de ponteiros.
| Tipo |
Faixa |
uint |
uint32 em sistemas de 32 bits, uint64 em sistemas de 64 bits |
int |
int32 em sistemas de 32 bits, int64 em sistemas de 64 bits |
uintptr |
Tipo de inteiro sem sinal usado para armazenar endereços de ponteiros, usado principalmente em programação de baixo nível, como operações inseguras |
Agora, vamos criar um arquivo chamado integer.go para demonstrar o uso de inteiros:
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)
}
Após executar o programa, obtemos a seguinte saída:
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
Explicação da saída:
The type int in the current environment is 64 bits: Esta linha mostra que o tipo int no sistema onde o código está sendo executado é de 64 bits (ou 8 bytes), indicando que é um int64. unsafe.Sizeof(a) retorna o tamanho da variável a em bytes, e multiplicar por 8 converte para bits. Isso significa que o tipo int pode armazenar valores inteiros maiores.
The value of b is 125, and the type is int8: Aqui, declaramos uma variável b do tipo int8 e atribuímos o valor 125. A saída confirma isso mostrando tanto o valor quanto o tipo de dados.
c + d = 5, 10 - 5 = 5, 8 * 10 = 80: Estas linhas mostram operações aritméticas básicas com inteiros: adição, subtração e multiplicação. A saída confirma os resultados corretos dessas operações.
The address of x stored in ptr is: 824634818784: Isso demonstra como uintptr pode ser usado para armazenar um endereço de memória. Estamos convertendo um ponteiro para a variável inteira x para um tipo uintptr. O valor real do endereço variará cada vez que o programa for executado. Este é um caso de uso avançado, normalmente encontrado em operações inseguras e programação de sistemas.
Neste arquivo, a função unsafe.Sizeof() pode ser usada para obter o número de bytes ocupados pelo tipo de variável atual. 1 byte (byte) é igual a 8 bits, então unsafe.Sizeof()*8 pode obter o número de bits ocupados pelo tipo. Pela saída, podemos ver que o ambiente online é de 64 bits. O tipo real de int no ambiente online é int64.
Podemos usar o seguinte comando no terminal para determinar a arquitetura do sistema atual:
dpkg --print-architecture
amd64