• 你好!欢迎你的到来
  • 关于我们
  • 首页 博客 学习笔记 技术导航 工具
  • 博文分类
    • PHP(43)
    • MySQL(11)
    • Linux(28)
    • html(3)
    • JQuery(4)
    • JavaScript(9)
    • svn(2)
    • CSS(2)
    • seajs(1)
    • go(44)
    • redis(1)
    • nginx(8)
    • mongo(0)
    • es(0)
    • 算法(0)
    • 其他(26)
    • 生活(1)
    专栏
    • Jquery基础教程
      • 文章:(15)篇
      • 阅读:17792
    • shell命令
      • 文章:(42)篇
      • 阅读:61196
    • Git教程
      • 文章:(36)篇
      • 阅读:119124
    • leetCode刷题
      • 文章:(37)篇
      • 阅读:15711
    • 摘要视图
    • 目录视图
    go语言中int 和 uint占用32bits还是64bits呢?
    2019-05-03 16:30 阅读(2648) 评论(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 位")
    }


    本文为原创文章,请尊重辛勤劳动,如需转载,请保留本文地址
    http://www.findme.wang/blog/detail/id/628.html

    若您感觉本站文章不错,读后有收获,不妨赞助一下?

    我要赞助

    您还可以分享给朋友哦

    更多
    顶
    2
    踩
    0
    • 上一篇: Golang定时器timer和ticker
    • 下一篇: go语言中类型转换
    • 查看评论
    • 正在加载中...
    • 留言
    • 亲,您还没有登录,登录后留言不需要审核哦!
      可以使用如下方式登录哦!
  • CSDN | 新浪微博 | github | 关于我们 | 我要留言 | 友链申请
  • 豫ICP备18038193号    Copyright ©lidequan All Rights Reserved