-
博文分类专栏
- Jquery基础教程
-
- 文章:(15)篇
- 阅读:46559
- shell命令
-
- 文章:(42)篇
- 阅读:154228
- Git教程
-
- 文章:(36)篇
- 阅读:234845
- leetCode刷题
-
- 文章:(76)篇
- 阅读:131787
-
go语言中int 和 uint占用32bits还是64bits呢?2019-05-03 16:30 阅读(15660) 评论(0)
一、简介
一直在使用uint和int,在我潜意识里面,uint和int占用32比特。在官方文档(builtin/builtine)里面,
int描述如下:
// int is a signed integer type that is at least 32 bits in size. It is a
// distinct type, however, and not an alias for, say, int32.
即int是一个有符号整数类型,大小至少为32位。且它是一个独特的类型,而不是int32的别名。
uint描述如下:
// uint is an unsigned integer type that is at least 32 bits in size. It is a
// distinct type, however, and not an alias for, say, uint32.
即uint是一个无符号整数类型,大小至少为32位。且它是一个独特的类型,而不是uint32的别名。
也是就是,uint和int,可以是32位,也可以是64位。
在32操作系统上,uint和int占用32比特。
在64操作系统上,uint和int占用64比特。
二、计算最大的int数值
要想计算出int最大值,所有我们需要对负数的存储,有一定的了解,如下:
int是有符号类型(signed integer type)的,即第一位,用来存储符号。以二进制来看int数据,
0***** 代表非负int
1***** 代表负int
所以
"0****"中,"*"位的数字都为1,则为最大的int值。
"1****"中,"*"位的数字都为0,则为最小的int值。
1、使用int(-1)无符号右移
最简单的方案是,将int(-1) 无符号右移1位,即可以获得int的最大值,如下:
11111*****1111 ===》01111****1111 // 其中**** 代表多个1
可惜,go不支持“无符号右移”。
2、使用uint(0)取反后右移
既然针对int的移动,没有改变符号位,那么我们就考虑移动uint。
uint(0) 二进制如下:
00****00 //其中**** 代表多个0
取反uint(0),可以得到uint的最大值,如下:
11****11 //其中**** 代表多个1
二进制是不是和相当于int(-1)一样呢?然后,我们针对uint的最大值,右移一位,如下:
01****11 //其中**** 代表多个1
即可以得到int最大值。如下:
tpm := ^uint(0) >> 1 intMax := int(tpm) //int的最大值 intMin := int(^tpm) //int的最小值
三、判断操作系统是64位还是32位
利用int和uint在32位和64位操作系统上面,占用比特数差异性,我们可以做如下判断:
if ^uint(0) >> 32 == 0 { fmt.Println("当前操作系统为 32 位") } else if (^uint(0) >> 64) == 0 { fmt.Println("当前操作系统为 64 位") }