3 回答

TA貢獻1784條經驗 獲得超9個贊
這種“轉換”不起作用的原因是因為您的程序中沒有轉換。賦值不會隱式執行轉換(接口類型除外)。
請參閱管理常量值分配的可分配性規則:
如果以下條件之一適用,則值 x 可分配給 T 類型的變量(“x 可分配給 T”):
x 的類型與 T 相同。
...
x 是一個無類型的常量,可以用 T 類型的值表示。
在這種情況下,math.MinInt64
是一個無類型常量,但它不能用 type 的值表示uint64
,因為它是這樣定義的:
uint64 所有無符號 64 位整數的集合(0 到 18446744073709551615)
負 64 位整數和無符號 64 位整數之間的轉換是可能的,但您需要真正的轉換。然而,由于熟悉的規則,您仍然不能直接轉換常量值:
如果 x 可以由 T 的值表示,則常數值 x 可以轉換為類型 T。
所以,正確的方法是先將數字賦給一個非常量值:
x := int64(math.MinInt64)
y := uint64(x)
fmt.Println(y)

TA貢獻1847條經驗 獲得超7個贊
int64 適合 uint64,但這不是問題中的代碼所做的。該代碼將常量 math.MinInt64 分配給 uint64 變量randomNum。編譯器報告錯誤,因為該常量不能用 uint64表示。
首先分配給一個變量,這樣常量的規則就不會適用:
x := int64(math.MinInt64)
var randomNum = uint64(x)
fmt.Println(randomNum)

TA貢獻1795條經驗 獲得超7個贊
誰說你不能?好的,編譯器是這么說的。但是編譯器意味著您不能將值 -9223372036854775808
放入uint64
變量中,這是正確的;您需要將位模式作為 int64 表示 -9223372036854775808,但表示將被視為 uint64的值uint64
:
var randomNum uint64 = math.MinInt64 + math.MaxUint64 + 1
效果很好——或者當然可以做GastroHealth 展示的事情。
我主要研究這個,因為我想將 [8] 字節轉換回具有正確符號的 int64,但到目前為止,我只看到返回 uint64 的函數(例如
binary.LittleEndian.Uint64
)。
我們做的很明顯:
signed := int64(v ^ 0x8000000000000000 - 0x8000000000000000)
(嗯,看過幾次就很明顯了。)
在這里查看一個完整的示例(我使用大端,我更喜歡它供人類使用)。請注意,您可以在signed := int64(v)
這里執行;翻轉和減法技巧非常適合作為您還沒有變量的表達式。
- 3 回答
- 0 關注
- 231 瀏覽
添加回答
舉報