以这一行为例(Yul):
mstore(0x24, 0x0443455243)
如果是mstore(0x20, 0x0443455243),则整个值将存储在位置0x20。但是,如果使用0x24,我希望值存储在0x24,但是只有第一个字节存储在0x20,而接下来的4个字节溢出并存储在位置0x40的末尾。
mstore(0x20, 0x0443455243)
0x20
0x24
0x40
为什么会这样呢?
iklwldmw1#
内存和存储中的数据保存方式略有不同。虽然内存被分配在32字节大小的缓冲区中,但内存中没有插槽,类似于存储。这就是为什么谈论位置X的结束或开始并不完全正确,因为位置是一个单字节的位置。Remix只是将内存表示拆分为块,以获得更好的视觉表示。通过存储一个值(* 即〈= 32 bytes *),指定位置(index),EVM从该位置开始选取一个32 bytes大小的缓冲区,并将该值打包到该缓冲区的末尾。
32..63
36..67
0x24..0x43
二进制(0x0443455243)占用5个字节 (字符串长度04,数据43 45 52 43),因此当我们将它们放入36..67范围时,它将占据该缓冲区范围的末尾,位置将为:63,64,65,66,67 .
0x0443455243
04
43 45 52 43
63,64,65,66,67
63
0x3f
0x20-0x3f
64..67
0x40..0x43
0x40-0x5f
1条答案
按热度按时间iklwldmw1#
内存和存储中的数据保存方式略有不同。虽然内存被分配在32字节大小的缓冲区中,但内存中没有插槽,类似于存储。这就是为什么谈论位置X的结束或开始并不完全正确,因为位置是一个单字节的位置。Remix只是将内存表示拆分为块,以获得更好的视觉表示。
通过存储一个值(* 即〈= 32 bytes *),指定位置(index),EVM从该位置开始选取一个32 bytes大小的缓冲区,并将该值打包到该缓冲区的末尾。
mstore(0x20, 0x0443455243)
采用索引32..63
处的缓冲区范围(以小数表示)。mstore(0x24, 0x0443455243)
取缓冲区范围36..67
/0x24..0x43
。二进制(
0x0443455243
)占用5个字节 (字符串长度04
,数据43 45 52 43
),因此当我们将它们放入36..67
范围时,它将占据该缓冲区范围的末尾,位置将为:63,64,65,66,67
.63
(0x3f
)在范围端0x20-0x3f
内64..67
/(0x40..0x43
)在范围开始0x40-0x5f
内