Golang uint16 type
last modified May 8, 2025
This tutorial explains how to use the uint16 built-in type in Go.
We'll cover basic concepts with practical examples of working with 16-bit
unsigned integers.
The uint16 type represents 16-bit unsigned integers in Go. It can store values from 0 to 65535. This type is useful when memory efficiency is important and the value range is known.
In Go, uint16 is part of the family of unsigned integer types.
It's commonly used in binary protocols, network programming, and embedded
systems where exact size matters.
Basic uint16 declaration and usage
The simplest use of uint16 involves variable declaration and
basic arithmetic operations. This example shows fundamental uint16 usage.
package main
import "fmt"
func main() {
var a uint16 = 1000
var b uint16 = 2000
sum := a + b
fmt.Printf("a: %d, b: %d, sum: %d\n", a, b, sum)
fmt.Printf("Type of sum: %T\n", sum)
// Division example
quotient := b / a
fmt.Printf("2000 / 1000 = %d\n", quotient)
}
The example demonstrates basic arithmetic with uint16 values. Note that all operations stay within the uint16 type unless explicitly converted.
Handling uint16 overflow
Since uint16 has a fixed range, overflow can occur. This example shows how Go handles uint16 overflow situations.
package main
import "fmt"
func main() {
max := uint16(65535)
fmt.Println("Max uint16:", max)
// This would overflow
// next := max + 1 // Compile-time error if uncommented
// Runtime overflow wraps around
next := max
next++
fmt.Println("After overflow:", next)
// Underflow example
zero := uint16(0)
zero--
fmt.Println("After underflow:", zero)
}
Go handles uint16 overflow by wrapping around. The value 65535 + 1 becomes 0, and 0 - 1 becomes 65535. This is standard behavior for unsigned integers.
Using uint16 in binary operations
The uint16 type is particularly useful for bitwise operations. This example demonstrates common bit manipulation patterns with uint16.
package main
import "fmt"
func main() {
flags := uint16(0b1010101010101010)
fmt.Printf("Initial flags: %016b\n", flags)
// Set bit 3
flags |= 1 << 3
fmt.Printf("After setting bit 3: %016b\n", flags)
// Clear bit 5
flags &^= 1 << 5
fmt.Printf("After clearing bit 5: %016b\n", flags)
// Toggle bit 7
flags ^= 1 << 7
fmt.Printf("After toggling bit 7: %016b\n", flags)
// Check bit 10
if flags&(1<<10) != 0 {
fmt.Println("Bit 10 is set")
} else {
fmt.Println("Bit 10 is not set")
}
}
Bitwise operations are efficient with uint16. The example shows setting, clearing, toggling, and checking individual bits in a uint16 value.
uint16 in network programming
The uint16 type is commonly used in network programming for port numbers and protocol fields. This example demonstrates uint16 in a network context.
package main
import (
"encoding/binary"
"fmt"
"net"
)
func main() {
// Representing a port number
port := uint16(8080)
fmt.Printf("Port number: %d\n", port)
// Converting to network byte order (big-endian)
buf := make([]byte, 2)
binary.BigEndian.PutUint16(buf, port)
fmt.Printf("Network byte order: % x\n", buf)
// Parsing back from network byte order
restoredPort := binary.BigEndian.Uint16(buf)
fmt.Printf("Restored port: %d\n", restoredPort)
// Common network constants
fmt.Printf("HTTP port: %d, HTTPS port: %d\n", 80, 443)
}
Network protocols often use uint16 for port numbers and similar fields. The
binary package helps with byte order conversions.
uint16 in arrays and slices
Working with collections of uint16 values demonstrates memory efficiency. This example shows uint16 arrays and slices.
package main
import (
"fmt"
"unsafe"
)
func main() {
// Array of uint16 values
data := [5]uint16{10, 20, 30, 40, 50}
fmt.Println("Array:", data)
// Slice of uint16 values
slice := data[1:4]
fmt.Println("Slice:", slice)
// Memory usage comparison
var ui16 uint16
var ui32 uint32
fmt.Printf("Size of uint16: %d bytes\n", unsafe.Sizeof(ui16))
fmt.Printf("Size of uint32: %d bytes\n", unsafe.Sizeof(ui32))
// Processing slice elements
sum := uint16(0)
for _, v := range slice {
sum += v
}
fmt.Println("Sum of slice elements:", sum)
}
Using uint16 in arrays and slices can save memory compared to larger integer types. The example shows declaration, slicing, and iteration.
Source
This tutorial covered the uint16 type in Go with practical
examples of its usage in various programming contexts.
Author
List all Golang tutorials.