2 回答
TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊
如果你有這個(gè):
var?s?uint?=?33 fmt.Println(1?<<?s)
然后引用的部分適用:
如果非常量移位表達(dá)式的左操作數(shù)是無類型常量,則首先將其隱式轉(zhuǎn)換為移位表達(dá)式單獨(dú)由其左操作數(shù)替換時(shí)所假定的類型。
因?yàn)?code>s不是常量(它是變量),所以1 >> s是非常量移位表達(dá)式。左操作數(shù)是1一個(gè)無類型常量(例如int(1),將是一個(gè)類型化常量),因此它被轉(zhuǎn)換為一個(gè)類型,如果表達(dá)式簡單地1代替1 << s:
fmt.Println(1)
在上面,無類型常量1將被轉(zhuǎn)換為int,因?yàn)檫@是它的默認(rèn)類型。常量的默認(rèn)類型在Spec: Constants:
無類型常量有一個(gè)默認(rèn)類型,即常量在需要類型化值的上下文中隱式轉(zhuǎn)換為的類型,例如,在沒有顯式類型的短變量聲明中。
i := 0無類型常量的默認(rèn)類型分別為bool、rune、int、float64或complex128,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 操場上,大小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
請注意,如果您編寫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ì)溢出。
從 轉(zhuǎn)換為int16只int8保留最低 8 位。整數(shù)使用2 的補(bǔ)碼格式表示,其中最高位是1負(fù)數(shù)。
這在規(guī)范中有詳細(xì)說明:轉(zhuǎn)換:
在整數(shù)類型之間轉(zhuǎn)換時(shí),如果值為有符號整數(shù),則將其符號擴(kuò)展為隱式無限精度;否則為零擴(kuò)展。然后將其截?cái)嘁赃m合結(jié)果類型的大小。例如,如果
v := uint16(0x10F0),則uint32(int8(v)) == 0xFFFFFFF0。轉(zhuǎn)換總是產(chǎn)生有效值;沒有溢出的跡象。
因此,當(dāng)您將int16值轉(zhuǎn)換為 時(shí)int8,如果源編號的1位位置為 7(第 8 位),則結(jié)果將為負(fù),即使源不是負(fù)數(shù)。類似地,如果源在位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
TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超3個(gè)贊
您正在以 32 位模式構(gòu)建和運(yùn)行程序(去游樂場?)。其中,int 是 32 位寬的,其行為與 int32 相同。
- 2 回答
- 0 關(guān)注
- 236 瀏覽
添加回答
舉報(bào)
