第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Golang 移位運(yùn)算符轉(zhuǎn)換

Golang 移位運(yùn)算符轉(zhuǎn)換

Go
慕尼黑5688855 2023-06-19 13:43:37
我不明白在 golang 中如何1<<s返回0if var s uint = 33。而是1<<33回歸8589934592。移位運(yùn)算符轉(zhuǎn)換如何以 0 值結(jié)束。我正在閱讀語(yǔ)言規(guī)范并停留在本節(jié)中: https ://golang.org/ref/spec#Operators特別是文檔中的這一段:“移位表達(dá)式中的右操作數(shù)必須具有無(wú)符號(hào)整數(shù)類(lèi)型,或者是由 uint 類(lèi)型的值表示的無(wú)類(lèi)型常量。 如果非常量移位表達(dá)式的左操作數(shù)是無(wú)類(lèi)型常量,則首先將其隱式轉(zhuǎn)換為類(lèi)型它會(huì)假設(shè)移位表達(dá)式是否被單獨(dú)的左操作數(shù)替換?!惫俜?Golang 文檔中的一些示例:var s uint = 33var i = 1<<s                  // 1 has type intvar j int32 = 1<<s            // 1 has type int32; j == 0var k = uint64(1<<s)          // 1 has type uint64; k == 1<<33更新:另一個(gè)非常相關(guān)的問(wèn)題,舉個(gè)例子:package mainimport (    "fmt")func main() {v := int16(4336)    fmt.Println(int8(v))}本節(jié)目回歸-16數(shù)字如何4336轉(zhuǎn)換-16為int16int8
查看完整描述

2 回答

?
慕容3067478

TA貢獻(xiàn)1773條經(jīng)驗(yàn) 獲得超3個(gè)贊

如果你有這個(gè):

var?s?uint?=?33
fmt.Println(1?<<?s)

然后引用的部分適用:

如果非常量移位表達(dá)式的左操作數(shù)是無(wú)類(lèi)型常量,則首先將其隱式轉(zhuǎn)換為移位表達(dá)式單獨(dú)由其左操作數(shù)替換時(shí)所假定的類(lèi)型。

因?yàn)?code>s不是常量(它是變量),所以1 >> s是非常量移位表達(dá)式。左操作數(shù)是1一個(gè)無(wú)類(lèi)型常量(例如,int(1)將是一個(gè)類(lèi)型化常量),因此它被轉(zhuǎn)換為一個(gè)類(lèi)型,如果表達(dá)式簡(jiǎn)單地1代替1 << s:

fmt.Println(1)

在上面,無(wú)類(lèi)型常量1將被轉(zhuǎn)換為int,因?yàn)檫@是它的默認(rèn)類(lèi)型。常量的默認(rèn)類(lèi)型在Spec: Constants:

無(wú)類(lèi)型常量有一個(gè)默認(rèn)類(lèi)型,即常量在需要類(lèi)型化值的上下文中隱式轉(zhuǎn)換為的類(lèi)型,例如,在沒(méi)有顯式類(lèi)型的短變量聲明中。i := 0無(wú)類(lèi)型常量的默認(rèn)類(lèi)型分別為bool、rune、int、float64complex128,string具體取決于它是布爾值、符文、整數(shù)、浮點(diǎn)數(shù)、復(fù)數(shù)還是字符串常量。

上述結(jié)果取決于體系結(jié)構(gòu)。如果int是 32 位,它將是0.?如果int是 64 位,它將是8589934592(因?yàn)閷⑽灰苿?dòng)133 次會(huì)將其移出 32 位int數(shù)字)。

在 Go 操場(chǎng)上,大小int為 32 位(4 字節(jié))??催@個(gè)例子:

fmt.Println("int size:", unsafe.Sizeof(int(0)))


var s uint = 33


fmt.Println(1 << s)

fmt.Println(int32(1) << s)

fmt.Println(int64(1) << s)

上面的輸出(在Go Playground上試試):


int size: 4

0

0

8589934592

如果我在我的 64 位計(jì)算機(jī)上運(yùn)行上面的應(yīng)用程序,輸出是:


int size: 8

8589934592

0

8589934592

請(qǐng)注意,如果您編寫(xiě)1 << 33,那是不一樣的,那不是一個(gè)非常量移位表達(dá)式,您的引用適用于:"the left operand of a non-constant shift expression"。1<<33是一個(gè)常量移位表達(dá)式,在“常量空間”進(jìn)行計(jì)算,結(jié)果將轉(zhuǎn)換為int不適合 32 位的int,因此會(huì)出現(xiàn)編譯時(shí)錯(cuò)誤。它適用于變量,因?yàn)樽兞靠赡軙?huì)溢出。常量不會(huì)溢出:

數(shù)值常量表示任意精度的精確值并且不會(huì)溢出。

更新:

回答您的補(bǔ)充:從 轉(zhuǎn)換為int16int8保留最低 8 位。整數(shù)使用2 的補(bǔ)碼格式表示,其中最高位是1負(fù)數(shù)。

這在規(guī)范中有詳細(xì)說(shuō)明:轉(zhuǎn)換:

在整數(shù)類(lèi)型之間轉(zhuǎn)換時(shí),如果值為有符號(hào)整數(shù),則將其符號(hào)擴(kuò)展為隱式無(wú)限精度;否則為零擴(kuò)展。然后將其截?cái)嘁赃m合結(jié)果類(lèi)型的大小。例如,如果v := uint16(0x10F0),則uint32(int8(v)) == 0xFFFFFFF0。轉(zhuǎn)換總是產(chǎn)生有效值;沒(méi)有溢出的跡象。

因此,當(dāng)您將int16值轉(zhuǎn)換為 時(shí)int8,如果源編號(hào)的1位位置為 7(第 8 位),則結(jié)果將為負(fù),即使源不是負(fù)數(shù)。類(lèi)似地,如果源在位0位置 7,結(jié)果將為正,即使源為負(fù)。

看這個(gè)例子:

for _, v := range []int16{4336, -129, 8079} {

? ? fmt.Printf("Source? ? : %v\n", v)

? ? fmt.Printf("Source hex: %4x\n", uint16(v))

? ? fmt.Printf("Result hex: %4x\n", uint8(int8(v)))

? ? fmt.Printf("Result? ? : %4v\n", uint8(int8(v)))

? ? fmt.Println()

}

輸出(在Go Playground上嘗試):


Source? ? : 4336

Source hex: 10f0

Result hex:? ?f0

Result? ? :? -16


Source? ? : -129

Source hex: ff7f

Result hex:? ?7f

Result? ? :? 127


Source? ? : 8079

Source hex: 1f8f

Result hex:? ?8f

Result? ? : -113


查看完整回答
反對(duì) 回復(fù) 2023-06-19
?
ABOUTYOU

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊

您正在以 32 位模式構(gòu)建和運(yùn)行程序(去游樂(lè)場(chǎng)?)。其中,int 是 32 位寬的,其行為與 int32 相同。



查看完整回答
反對(duì) 回復(fù) 2023-06-19
  • 2 回答
  • 0 關(guān)注
  • 154 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)