1. 程式人生 > >golang判斷平臺是32位還是64位

golang判斷平臺是32位還是64位

在看go語言聖經時,
文中提到可以利用下面的表示式獲取系統是32位還是64位的.

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

開始看到這式子, 感覺很奇怪, 後面自己找了些資料, 搞明白了.

首先是^uint(0), uint型別並不是一個固定長度的型別,
^uint(0)在32位系統上返回的是0XFFFFFFFF, 也就是 2 32

2^{32} , 在64位系統上返回的是0xFFFFFFFFFFFFFFFF, 也就是 2 64 2^{64} .

然後左移(<<)和右移(>>)運算順序都是從左到右的, ^為位反.
那麼

  • 對於32位系統:
    ^unit(0)

    : 2 32 1 2^{32} - 1 , ( 2
    32 1 2^{32} - 1
    ) >> 63 得到0, 32 << 0(也就是32左移0位), 得32

  • 對於64位系統:
    ^unit(0): 2 64 1 2^{64} - 1 , ( 2 64 1 2^{64} - 1 ) >> 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


歡迎補充指正!