亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么不能將 int64 的最小值存儲到 uint64 中?

為什么不能將 int64 的最小值存儲到 uint64 中?

Go
開心每一天1111 2022-10-10 15:54:47
理論上 int64 適合 uint64,當然它們的數值會有所不同,因為第一位是為 int64 上的符號保留的,但是為什么我不能進行這種轉換呢?對我來說似乎有效import (    "fmt"    "math")func main() {    var randomNum uint64 = math.MinInt64    fmt.Println(randomNum)}產生錯誤constant -9223372036854775808 overflows uint64從技術上講,這math.MinInt64是-9223372036854775808一個適合 63 位加號的數字。我主要研究這個,因為我想轉換8 bytes回具有正確符號的 int64,但到目前為止我只看到返回的函數uint64binary.LittleEndian.Uint64(bytesArrays[0:8])
查看完整描述

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)

游樂場鏈接


查看完整回答
反對 回復 2022-10-10
?
aluckdog

TA貢獻1847條經驗 獲得超7個贊

int64 適合 uint64,但這不是問題中的代碼所做的。該代碼將常量 math.MinInt64 分配給 uint64 變量randomNum。編譯器報告錯誤,因為該常量不能用 uint64表示。


首先分配給一個變量,這樣常量的規則就不會適用:


x := int64(math.MinInt64)

var randomNum = uint64(x)

fmt.Println(randomNum)


查看完整回答
反對 回復 2022-10-10
?
一只萌萌小番薯

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)這里執行;翻轉和減法技巧非常適合作為您還沒有變量的表達式。


查看完整回答
反對 回復 2022-10-10
  • 3 回答
  • 0 關注
  • 231 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號