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


欢迎补充指正!

你可能感兴趣的:(Golang,golang学习笔记)