理論上 int64 適合 uint64,當然它們的數值會有所不同,因為第一位是為 int64 上的符號保留的,但是為什么我不能進行這種轉換?這對我來說似乎有效
import (
"fmt"
"math"
)
func main() {
var randomNum uint64 = math.MinInt64
fmt.Println(randomNum)
}
從技術上講,這math.MinInt64是-9223372036854775808一個適合 63 位加號的數字。
我主要是在研究這個,因為我想轉換4 bytes回具有正確符號的 int64,但到目前為止我只看到回傳的函式uint64
binary.LittleEndian.Uint64(bytesArrays[0:4])
uj5u.com熱心網友回復:
int64 fits 適合 uint64,但這不是問題中的代碼所做的。該代碼將常量 math.MinInt64 分配給 uint64 變數randomNum。編譯器報告錯誤,因為常量不能用 uint64表示。
首先分配給變數,以便常量規則不適用:
x := int64(math.MinInt64)
var randomNum = uint64(x)
fmt.Println(randomNum)
uj5u.com熱心網友回復:
這種“轉換”不起作用的原因是因為您的程式中沒有轉換。賦值不會隱式執行轉換(介面型別除外)。
請參閱管理常量值分配的可分配性規則:
如果滿足以下條件之一,則值 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)
游樂場鏈接
uj5u.com熱心網友回復:
誰說你不能?好吧,編譯器說,有點。但是編譯器的意思是你不能把值 -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)這里執行;翻轉和減法技巧非常適合作為您還沒有變數的運算式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/335647.html
標籤:走
