你说 Go 吧,有时候写起代码来会很舒服,因为语言足够简单,类库也足够齐全,但有时候还真得费点脑筋,比如说各种整型的最大值。
像 C 和 C++ 这样的语言还有一个标准库 <limits.h>
定义了各种整型的最大值和最小值,比如 int
类型的最大值常量 INT_MAX
,最小值常量 INT_MIN
,无符号整型 uint
类型的最大值常量 UINT_MAX
然而,Go 语言就没有,还好,它比较简单,有位操作符,我们就可以直接使用位操作符来获取各种类型的最大值
比如无符号 32 位整型 uint32
它的最小值为 0
,这个应该没异议吧,而最大值,可以用下面的语法来定义
const UINT32_MIN uint32 = 0 const UINT32_MAX uint32 = ^uint32(0)
为什么呢 ?
- 最小值 0 的二进制格式中,所有的位都是
0
,也就是00000000 00000000 00000000 00000000
- 而最大值,就是所有的 32 位都是
1
,也就是11111111 11111111 11111111 11111111
,这不就是 0 的取反
而对于有符号的 32 位整型 int32
-
最大值为
const INT32_MAX = int(^uint(0) >> 1)
最大值就是从左到右,除了第一位为 0 ,其它位都是
1
,二进制格式为01111111 11111111 11111111 11111111
。这个二进制,就是^uint32(0) >> 1
-
最小值为
const INT32_MIN = ^INT32_MAX
最小值就是从左到右,除了第一位为
1
,其它为都是0
,二进制格式为10000000 0000000 00000000 00000000
,不就是最大值的取反^INT32_MAX
其实,很多人应该会问,最小值为什么不是全部都是
1
,说起来就话长了,这涉及到 补码 的知识,以后有空再讲解吧
至于其它位数的整型,如法炮制即可
目前尚无回复