Go 语言的无符号整型(uint)

上个小节我们主要学习了 Go 语言中的整型 int 数据类型,本小节主要介绍了 Go 语言中处理无符号的整数的数据类型。

 

1. 定长类型

序号 类型 长度
1 uint8 0~255
2 uint16 0~65535
3 uint32 0~4294967295
4 uint64 0~18446744073709551615

 

2. 不定长类型

在 Go 语言中也实现了随着平台位数变化而变化的数据类型uint。一般来说,这个类型在32位的系统中长度和uint32一致,在64位的系统中长度和uint64一致。

代码块
  • package main
  • 2
  • import (
  • 4        "fmt"
  • 5        "math"
  • )
  • 7
  • func main() {
  • 9         var num uint
  • 10       num = math.MaxUint64 //将e赋予uint64的最大值:18446744073709551615
  • 11       fmt.Println(num)
  • 12 }

在 64 位环境中执行结果:

图片描述

64 位操作系统执行结果

在 32 位环境中,因为int的长度与int32相等了,只有32位,所以执行时会报超出取值范围的错误:

图片描述

64 位操作系统执行结果

 

3. 各类型的互相转换

Go 语言是强类型语言,各个虽然同是无符号整型,但是不同无符号整型的变量不允许直接赋值,需要进行强制类型转换,同时长度大的无符号整型向长度小的无符号整型转换时,要考虑溢出问题。而且不同类的整型无法进行运算,想要进行运算必须要进行强制类型转换,使他们都变成同一类型之后,再运算。举一个 uint8 和 uint16 类型的变量赋值与计算的例子:


代码块
  • 1 package main 
  • 2
  • import (
  • 4        "fmt"
  • 5        "math"
  • )
  • 7
  • 8  func main() {
  • 9          var a uint8 = math.MaxUint8
  • 10        var b uint16 = math.MaxUint8 + 1
  • 11        fmt.Println(a, b)
  • 12
  • 13        a = uint8(b)
  • 14        fmt.Println(a, b) //因为b长度过长,在转换为uint8的过程中溢出了
  • 15
  • 16        //无符号整型变量可以和常数进行计算
  • 17        a = a + 1
  • 18        b = b + 1
  • 19        fmt.Println(a, b)
  • 20
  • 21        //不同类型的无符号整型变量计算必须强转为相同类型,一般转换为长度大的来计算
  • 22        c := uint16(a) + b
  • 23        fmt.Println(c)
  • 24  }

输出结果:

图片描述

各类型相互转换输出结果

 

4. 小结

本文主要学习了 Go 语言中的无符号整型的使用,注意高精度向低精度转失真的风险。

文章来源于网络,侵删!

相关新闻