Type | Storage size | Value range
--- | --- | ---
int8 | 1 byte | -2<sup>7</sup> to 2<sup>7</sup>-1
uint8 | 1 byte | 0 to 2<sup>8</sup>-1
byte | 1 byte | alias for uint8
int16 | 2 bytes | -2<sup>15</sup> to 2<sup>15</sup>-1
uint16| 2 bytes | 0 to 2<sup>16</sup>-1
int32 | 4 bytes | -2<sup>31</sup> to 2<sup>31</sup>-1
rune | 4 bytes | alias for int32 (represents a Unicode code point)
uint32 | 4 bytes | 0 to 2<sup>32</sup>-1
int | 4 bytes or 8 bytes | -2<sup>31</sup> to 2<sup>31</sup>-1 or 2<sup>63</sup> to 2<sup>63</sup>-1
uint | 4 bytes or 8 bytes | 0 to 2<sup>32</sup>-1 or 0 to 2<sup>64</sup>-1
uintptr | 4 bytes or 8 bytes | an unsigned integer large enough to store the uninterpreted bits of a pointer value
int64 | 8 bytes | -2<sup>63</sup> to 2<sup>63</sup>-1
uint64 | 8 bytes | 0 to 2<sup>64</sup>-1
The uintptr is there to bypass the type system and allow Go to write runtime libraries, including the garbage collection system, in Go, and to call C-callable code including system calls using C pointers that are not handled by Go at all. If you're an implementer - e.g., providing access to system calls on a new OS - you'll need uintptr.
```
package main
import "fmt"
func main() {
var i8 int8 = -1
fmt.Println(i8)
var ui8 uint8 = 1
fmt.Println(ui8)
var b byte = 1
fmt.Println(b)
var i16 int16 = -1
fmt.Println(i16)
var ui16 int16 = 1
fmt.Println(ui16)
var i32 int32 = -1
fmt.Println(i32)
var r rune = 1
fmt.Println(r)
var ui32 uint32 = 1
fmt.Println(ui32)
var i int = -1
fmt.Println(i)
var ui uint = 1
fmt.Println(ui)
var uip uintptr = 1
fmt.Println(uip)
var i64 int64 = -1
fmt.Println(i64)
var ui64 uint64 = 1
fmt.Println(ui64)
}
```
Outputs:
```
-1
1
1
-1
1
-1
1
1
-1
1
1
-1
1
```