首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >您可以做bytes32(0),但不能做bytes32(1),这是为什么?

您可以做bytes32(0),但不能做bytes32(1),这是为什么?
EN

Ethereum用户
提问于 2022-05-03 12:05:18
回答 1查看 1.4K关注 0票数 0

标题很清楚。当我执行bytes32(1)时,它给我一个关于不能将constant_1转换为bytes32的错误。但我能做到零。我很害怕,因为我在合同上使用了bytes32(0),我很担心会出什么问题。

EN

回答 1

Ethereum用户

回答已采纳

发布于 2022-05-03 12:48:25

您可以做bytes32(0),但不能做bytes32(1),这是为什么?

这种语法是不允许的,因为solidity 0.5.0

类型系统:不允许从十进制文字到bytesXX类型的显式和隐式转换。

“解释”出现在文档中:

十进制数字文字不能隐式转换为固定大小的字节数组.十六进制数字字面值可以是,但只有在十六进制数正好符合字节类型的大小的情况下。作为例外,值为零的十进制和十六进制文本都可以转换为任意大小的字节类型。

因此,正如您所看到的,bytes32(0)是非常好的(因为值0的bytes32uint256的内部表示是相同的)。对于任何其他值,都有一些模糊(在我看来)是右侧的bytesX pad,而左边的intX / uintX pad,因此要么使用显式转换,要么完全指定初始化litteral:

代码语言:javascript
复制
pragma solidity ^0.8.0;

contract Example {

  function test() public view returns (bytes32, bytes32, bytes32) {
    // Not allowed : do you mean 0x0000000000000000000000000000000000000000000000000000000000000001 <- left padding
    //                        or 0x1000000000000000000000000000000000000000000000000000000000000000 <- right padding
    // bytes32 a = bytes32(0x1);

    // Allowed : Fully specified : left padding
    bytes32 a = 0x0000000000000000000000000000000000000000000000000000000000000001;

    // Allowed : Fully specified : right padding
    bytes32 b = 0x1000000000000000000000000000000000000000000000000000000000000000;

    // Allowed : Explicit conversion : left padding
    bytes32 c = bytes32(uint256(1));

    return (a, b, c);
  }
}

还不清楚为什么要使用十进制小数来初始化bytes32,但请记住,这不是它们的目的。它们是字节数组,而不是数值。

票数 4
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/127442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档