在看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 232−1, ( 2 32 − 1 2^{32} - 1 232−1) >> 63 得到0, 32 << 0(也就是32左移0位), 得32 -
对于64位系统:
^unit(0)
: 2 64 − 1 2^{64} - 1 264−1, ( 2 64 − 1 2^{64} - 1 264−1) >> 63 得到1, 32 << 1(也就是32左移1位), 得64
好巧妙!
总结:
主要是要明白uint不是一个固定长度的类型.
欢迎补充指正!