Solidity

將 uint64 轉換為 uint32 和 uint16

  • September 8, 2022

我寫了一份契約來了解將變數轉換為 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 投射它時,為什麼它會給出類似的答案?

我對此有一個解釋。

請注意,您的最後四個字節theKey0000ddc4。因此,我們看到我們有 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 字節)。我創建了這些函式getLast16BitsgetLast32Bits它們都產生了相同的結果。

如果您在這些空字節中放入更多值,那麼結果會有所不同。

例如,給定: 0x3fcb875faaffddc4,結果將是65535鑄造uint16和鑄造4294967295uint32

//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)));
   }

}

引用自:https://ethereum.stackexchange.com/questions/135230