{"content":{"title":"固定大小的数据类型：Solidity 是一种类型化语言","body":"Solidity 是一种类型化语言。\r\n\r\n与 JavaScript 或 Python 不同，在 JavaScript 或 Python 中你可以将一个布尔值、字符串或数字赋值给一个变量，而在 Solidity 中，每个变量只能有一种类型，并且必须明确声明。\r\n\r\n这也适用于函数。你必须明确指定参数类型和返回类型。\r\n\r\n现在让我们讨论一下最常用的类型：\r\n\r\n- 无符号整数，即 **uint256**\r\n- 布尔变量，即 **bool**\r\n- **address** 类型，用于存储以太坊钱包地址或智能合约地址\r\n\r\nSolidity 还有数组、字符串、结构体和其他类型，但它们需要稍微不同的处理方式，因此我们稍后再讨论。\r\n\r\n让我们看看返回这些类型的三个不同函数。\r\n\r\n```solidity\r\ncontract ExampleContract {\r\n    function getANumber()\r\n        public\r\n        pure\r\n        returns (uint256) {\r\n            uint256 x = 1;\r\n            return x;\r\n    }\r\n\r\n    function getABoolean()\r\n        public\r\n        pure\r\n        returns (bool) {\r\n            bool y = true;\r\n            return y;\r\n    }\r\n\r\n    function getAnAddress()\r\n        public\r\n        pure\r\n        returns (address) {\r\n            // Vitalik Buterin 的地址\r\n            address z = 0xd8da6bf26964af9d7eed9e03e53415d37aa96045;\r\n            return z;\r\n    }\r\n\r\n    function getAnotherAddress()\r\n        public\r\n        pure\r\n        returns (address) {\r\n            // USDC 稳定币的地址\r\n            address z2 = 0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48;\r\n            return z2;\r\n    }\r\n}\r\n```\r\n\r\n在这些例子中，我们将值赋值给变量，然后将其返回。当然，我们也可以直接返回值，像这样。\r\n\r\n```solidity\r\nfunction getAddress()\r\n        public\r\n        pure\r\n        returns (address) {\r\n    return 0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48;\r\n}\r\n```\r\n\r\n函数签名必须与返回类型匹配，这一点非常重要。以下代码会产生错误。\r\n\r\n```solidity\r\nfunction getAddressFail()\r\n    public\r\n    pure\r\n    returns (bool) {\r\n        return 0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48;\r\n}\r\n```\r\n\r\n**地址**\r\n\r\n地址表示为包含 40 个字符的十六进制字符串，并且始终以 0x 开头。有效的十六进制字符串包含字符 [0-9] 或 [a-f]。\r\n\r\n**警告**：手动输入地址时要小心。Solidity 会将 0x1 转换为值为 0x0000000000000000000000000000000000000001 的地址。如果你的地址少于 40 个十六进制字符，它会在前面填充零。\r\n\r\n如果你创建的地址超过 40 个字符，它将无法编译。\r\n\r\n请注意，40 个字符不包括前导的 0x。\r\n\r\n**uint256**\r\n\r\n让我们重新讨论 **uint256**。它到底是什么意思？\r\n\r\n**_u_** 表示无符号。它不能表示负数。**256** 表示它可以存储最大为 **256** 位的数字，即 2^256-1。\r\n\r\n让我们用 Python 看看这个数字有多大。\r\n\r\n```solidity\r\n>>> pow(2,256) - 1\r\n115792089237316195423570985008687907853269984665640564039457584007913129639935\r\n```\r\n\r\n这是一个非常大的数字，足以满足你在区块链上所需的大部分功能。\r\n\r\n在 Solidity 中，以下代码可以编译。\r\n\r\n```solidity\r\nfunction getBiggestNumber()\r\n    public\r\n    pure\r\n    returns (uint256) {\r\n        return 115792089237316195423570985008687907853269984665640564039457584007913129639935;\r\n}\r\n```\r\n\r\n但如果你使数字更大，代码将无法编译。\r\n\r\n可想而知，**uint128** 可以存储最大为 2^128 – 1 的无符号数字。\r\n\r\n大多数情况下，你应该只使用 uint256。使用 uint64 或 uint128 等较小类型的情况是一个更高级的主题。现在请坚持使用 uint256。\r\n\r\n**布尔类型**\r\n\r\n这一点很明显，它与其他语言类似。**bool** 变量要么为 **true**，要么为 **false**。仅此而已。\r\n\r\n###  了解更多\r\n\r\n请查看 [Web3 区块链培训营](https://learnblockchain.cn/openspace/1)，了解更多有关智能合约开发和代币标准的内容。\r\n\r\n \r\n\r\n>- 原文链接： [rareskills.io/learn-soli...](https://www.rareskills.io/learn-solidity/solidity-types)\r\n>- 登链社区 AI 助手，为大家转译优秀英文文章，如有翻译不通的地方，还请包涵～"},"author":{"user":"https://learnblockchain.cn/people/20722","address":null},"history":null,"timestamp":1740576831,"version":1}