uint256(uint160(msg.sender)) 和 uint256(bytes32(bytes20(msg.sender))) 返回不同的结果

问题描述 投票:0回答:1

我不知道为什么 uint256(uint160(msg.sender)) 和 uint256(bytes32(bytes20(msg.sender))) 返回不同的结果。

contract test {
    
     function check1() public  view returns(uint ) {
        return uint256(uint160(msg.sender)) ; 
    }

     function check2() public  view returns(uint ) {
        return uint256(bytes32(bytes20(msg.sender))) ;
    }



}

函数 check1() 返回值 520786028573371803640530888255888666801131675076 ; 函数 check2() 返回值 41260920106969412157321674113669319076297763250177730552014715551905833025536,该值比之前的值大得多。

理论上,check2() 和 check3() 都应该返回表示 msg.sender 地址的相同数值,因为没有信息丢失。 msg.sender 确实是 20 个字节和 uint160 。 我不知道具体在哪里,两个值变得不同。

byte solidity
1个回答
0
投票

简短回答:

bytes32
bytes20
对象的右侧填充零。

这可以通过返回字节而不是尝试将它们转换为 uint256 来看到。


pragma solidity ^0.8.20;

contract Test {
    
     function check1() public  view returns(bytes20) {
        return bytes20(msg.sender) ; 
    }

     function check2() public  view returns(bytes32) {
        return bytes32(bytes20(msg.sender)) ;
    }

}

致电

check1()
给我:
0x5b38da6a701c568545dcfcb03fcb875f56beddc4

打电话给
check2()
给我:
0x5b38da6a701c568545dcfcb03fcb875f56beddc4000000000000000000000000

至于为什么,我不确定这是否是因为返回时内存如何读取到堆栈,或者这是否与显式转换和填充规则有关。如果我弄清楚了,我会告诉你的。

© www.soinside.com 2019 - 2024. All rights reserved.