golang判断平台是32位还是64位

在看go语言圣经时,
文中提到可以利用下面的表达式获取系统是32位还是64位的.

bit := 32 << (^uint(0) >> 63)

开始看到这式子, 感觉很奇怪, 后面自己找了些资料, 搞明白了.

首先是^uint(0), uint类型并不是一个固定长度的类型,
^uint(0)在32位系统上返回的是0XFFFFFFFF, 也就是 2 32 2^{32} 232, 在64位系统上返回的是0xFFFFFFFFFFFFFFFF, 也就是 2 64 2^{64} 264.

然后左移(<<)和右移(>>)运算顺序都是从左到右的, ^为位反.
那么

  • 对于32位系统:
    ^unit(0): 2 32 − 1 2^{32} - 1 2321, ( 2 32 − 1 2^{32} - 1 2321) >> 63 得到0, 32 << 0(也就是32左移0位), 得32

  • 对于64位系统:
    ^unit(0): 2 64 − 1 2^{64} - 1 2641, ( 2 64 − 1 2^{64} - 1 2641) >> 63 得到1, 32 << 1(也就是32左移1位), 得64

好巧妙!


总结:
主要是要明白uint不是一个固定长度的类型.


参考:
https://stackoverflow.com/questions/36393806/why-go-vet-report-uint0-might-be-too-small-for-shift-of-63


欢迎补充指正!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值