2 回答

TA貢獻1818條經驗 獲得超3個贊
這兩個結果是不同的,因為第一個值被類型轉換為unsigned int32 (a uint32
)。
這發生在這里:uint32(^uint32(int32(2) -1))
或更簡單地說:uint32(-2)
Anint32
可以存儲 -2147483648 和 2147483647 之間的任何整數。
總共有 4294967296 個不同的整數值(2^32...即 32 位)。
一個無符號INT32可以存儲相同量不同的整數值,但是丟棄該標志(+/-)。換句話說,無符號int32 可以存儲從 0 到 4294967295 的任何值。
但是,當我們一個類型轉換會發生什么簽訂INT32(與值-2),以一個無符號INT32,它不可能存儲-2價值?
正如你所發現的,我們得到了 4294967294 的值。在一個小于 0 的整數是 4294967295 的數字系統中;4294967294 恰好是 0 - 2 的總和。

TA貢獻1820條經驗 獲得超9個贊
偶爾,我了解到為什么我們不能做
fmt.Printf("%v\n", int32(^uint32(int32(2) -1)))
在編譯時。它被^uint32(int32(2)-1)視為constant具有uint32類型的值。它的價值是4294967294。這超過了int32for的最大值2147483647。所以當你go build在源代碼文件上運行時。Compile error顯示。
這個問題的正確答案應該是:
fmt.Printf("%v\n, ^(int32(2) - 1))
即,我們應該先得到1in int32type的對應值,然后將其轉換為two's complementary formas 的值-1。
但是,根據這個 golang blog的An exercise: The largest unsigned int部分,這在運行時是合法的。所以代碼
var b int32 = 2
fmt.Printf("%v\n", int32(^uint32(int32(b)-1)))
沒關系。
而且,最后說到這和 Golang 中的常量有關。:)
- 2 回答
- 0 關注
- 525 瀏覽
添加回答
舉報