https://inasa.dev/blog/rss.xml

Go | 检测当前系统位数

2024-03-09

声明一个常量来表示当前操作系统的位数

const NativeWordBits = 32 << (^uint(0) >> 63) // 64 or 32 
  1. ^uint(0):对于无符号整型 uint(0)(其所有位都是0),按位取反操作会产生一个所有位都是1的数字。这个结果的数值上等同于 uint 能表示的最大值。
  2. >> 63:这个操作的结果依赖于 uint 的大小:
    • 在64位平台上,uint 类型为64位,^uint(0) 产生一个所有位都为1的64位数字。向右移动63位后,最左边的一位(最高位)会移动到最右边,结果为1(二进制的000...001)
    • 在32位平台上,尽管仍然执行相同的操作,但是由于 uint 的大小只有32位,所以这个操作实际上产生的结果是 0,因为32位无法表示一个向右移动了63位的值
  3. 32 << (... >> 63):最终这个表达式将32左移上一步的结果。在32位平台上,由于上一步的结果是 0,32 << 0 保持不变,仍然是 32。这反映了32位系统的字长。在64位平台上,上一步的结果是 1,因此 32 << 1 相当于将32乘以2,结果是 64。这反映了64位系统的字长。

检查当前操作系统是32位的还是64位的

const Is64bitOS = ^uint(0) >> 63 != 0 
const Is32bitOS = ^uint(0) >> 32 == 0 

  • Go101