Solidity
將 uint64 轉換為 uint32 和 uint16
我寫了一份契約來了解將變數轉換為 uint16 和 uint32 的區別。程式碼如下:
// SPDX-License-Identifier: MIT pragma solidity 0.8.0; contract Learning{ bytes8 theKey = 0x3fcb875f0000ddc4; function cast32() public view returns (uint32) { return uint32(uint64(theKey)); } function cast16() public view returns (uint16) { return uint16(uint64(theKey)); } }
致電
cast32()
and後cast16()
,我收到了類似的答案56772
。當我使用不同的 uint 即 uint16 和 uint32 投射它時,為什麼它會給出類似的答案?
我對此有一個解釋。
請注意,您的最後四個字節
theKey
是0000ddc4
。因此,我們看到我們有 2 個空字節 (0000) 和 2 個帶數據字節 (ddc4)。一個 32 位的數字是 4 個字節。一個 16 位的數字是 2 個字節。因此,當您投射0x3fcb875f_0000ddc4
到 a時uint16
,您正在複製ddc4
. 當您將其轉換為 auint32
時,您正在複製0000ddc4
,並且由於前 2 個字節沒有任何值,因此兩者都是ddc4
. 如果我們轉換ddc4
為十進制,它是56772
. 在這裡查看:https ://www.rapidtables.com/convert/number/hex-to-decimal.html我創建了 2 個遮罩值來複製數字的最後 32 位(4 字節)和相同數字的 16 位(2 字節)。我創建了這些函式
getLast16Bits
,getLast32Bits
它們都產生了相同的結果。如果您在這些空字節中放入更多值,那麼結果會有所不同。
例如,給定:
0x3fcb875faaffddc4
,結果將是65535
鑄造uint16
和鑄造4294967295
。uint32
//SPDX-License-Identifier: MIT pragma solidity ^0.8.16; contract Learning { uint32 public mask32 = 0x000000000000000000000000ffffffff; uint16 public mask16 = 0x0000000000000000000000000000ffff; bytes8 public theKey = 0x3fcb875f_0000ddc4; uint64 public theKey64 = uint64(theKey); function getLast16Bits() public view returns(uint) { return theKey64 & mask16; } function getLast32Bits() public view returns(uint) { return theKey64 & mask32; } function cast32() public view returns (uint32) { return uint32(uint64(theKey)); } function cast16() public view returns (uint16) { return uint16(uint32(uint64(theKey))); } }