Solidity 是一种静态类型语言,这意味着每个变量(状态变量和局部变量)都需要在编译时指定变量的类型。
Solidity 提供了几种基本类型,并且基本类型可以用来组合出复杂类型。
除此之外,类型之间可以在包含运算符号的表达式中进行交互。
“undefined
”或“null
”值的概念在Solidity中不存在,但是新声明的变量总是有一个 默认值 ,具体的默认值跟类型相关。 要处理任何意外的值,应该使用错误处理来恢复整个交易,或者返回一个带有第二个bool
值的元组表示成功。
bool/布尔类型
布尔值的取值范围为 true 和 false 。
默认值:false
pragma solidity ^0.8.0;
contract TestBool {
error NotEqual(bool A,bool B);
bool public A; // false
bool public B = true; //true
// require(A==B,"A not equal B");
if (A != B) {
error NotEqual(A,B);
}
}
运算符:
-
!
(逻辑非) -
&&
(逻辑与, “and” ) -
||
(逻辑或, “or” ) -
==
(等于) -
!=
(不等于)
int、uint/整数类型
int 有符号整型
默认为int256
不同位长的整形范围如下:
-
int8
取值范围:-(2 ** 7)到 2 ** 7 -1 -
int16
取值范围:-(2 ** 15)到 2 ** 15 -1 - ...
-
intX
取值范围:-(2**X
-1)到 2**(X
-1) -1 -
int256
取值范围:-(2 ** 255)到 2 ** 255 -1
uint 无符号整型
默认为uint256
不同位长的整形范围如下:
-
uint8
取值范围:0 到 2 ** 8 - 1 -
uint16
取值范围:0 到 2 ** 16 - 1 - ...
-
uintX
取值范围:0 到 2 ** X
- 1 -
uint256
取值范围:0 到 2 ** 256 - 1
运算符:
- 位运算符: & , | , ^ (异或), ~ (位取反)
- 移位运算符: << (左移位) , >> (右移位)
- 算数运算符: + , - , 一元运算负 - (仅针对有符号整型), * , / , % (取余或叫模运算) , ** (幂)
对于整形 X,可以使用 type(X).min 和 type(X).max 去获取这个类型的最小值与最大值。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract TestIntval {
int8 public i8 = -1;
int public i256 = 456;
int public i = -123; // int 等同于 int256
// int 的最大最小值
int public minInt = type(int).min;
int public maxInt = type(int).max;
uint8 public u8 = 1;
uint256 public u256 = 456;
uint public u = 123; // uint 等同于 uint256
// uint 的最大最小值
uint public minUInt = type(uint).min;
uint public maxUInt = type(uint).max;
function mini() public pure returns(uint8){
return type(uint8).max;
}
}
0.8.0 开始,算术运算有两个计算模式:一个是 “wrapping”(截断)模式或称 “unchecked”(不检查)模式,一个是”checked” (检查)模式。 默认情况下,算术运算在 “checked” 模式下,即都会进行溢出检查,如果结果落在取值范围之外,调用会通过 失败异常 回退。 你也可以通过 unchecked { ... }
切换到 “unchecked”模式
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;
contract C {
function f(uint a, uint b) pure public returns (uint) {
// 减法溢出会返回“截断”的结果
unchecked { return a - b; }
}
function g(uint a, uint b) pure public returns (uint) {
// 溢出会抛出异常
return a - b;
}
}
调用 f(2, 3)
将返回 2**256-1,
而 g(2, 3)
会触发失败异常。
unchecked
代码块可以在代码块中的任何位置使用,但不可以替代整个函数代码块,同样不可以嵌套。
此设置仅影响语法上位于 unchecked
块内的语句。 在块中调用的函数不会此影响。
address/地址
默认值: 0x0000000000000000000000000000000000000000
运算符:
示例:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract TestAddress {
//与其他机器语言相区别的类型就是这个address 类型,160-bit/20byte
address public myAddr = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;
//合约自己的地址
address contractAddress = address(this);
//跟普通的地址类型一样,但多了两个方法 transfer/send 这两个方法后面章节会讲到
// address sender = payable(0x5B38Da6a701c568545dCfcB03FcB875f56beddC4);
//可以使用 balance 属性来查询一个地址的余额
function getBalance()
public view
returns (uint256, uint256)
{
require(myAddr.balance < contractAddress.balance, "1 must lg 2");
return (myAddr.balance, contractAddress.balance);
}
}
bytes/字节数组
在计算机中的最小存储单位是 bit(位)
- 1byte等于8位
- Solidity中,byte可以赋值为
- 16进制数字
- 单引号的单个或多个字符
定长字节数组
bytes1 后面数字1是表示1字节 bytes默认等于bytes1
Bytes2 后面数字2是表示2字节
Bytes3 后面数字3是表示3字节
bytes4 后面数字4是表示4字节
...
bytes32 后面数字32是表示32字节
bytes32 等价于 int256或uint256 的位数
运算符
- 位运算符: &, |, ^ (按位异或), ~ (按位取反)
- 移位运算符: << (左移位), >> (右移位)
- 索引访问:如果 x 是 bytesI 类型,那么 x[k] (其中 0 <= k < I)返回第 k 个字节(只读)。
成员变量
.length
表示这个字节数组的长度(只读)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract BytesTest {
//定长字节数组,长度不可变
bytes1 public num1 = 0x12;
// bytes1 public num1 = 0x112; 溢出最大长度,这样会报错
// 也可以写成字符串类型
bytes4 public num2 = "0x12";
//也支持直接写 16 进制
bytes4 public num3 = 0x12121212;
//不足位的补0
bytes32 public num4 = 'abc'; //0x6162630000000000000000000000000000000000000000000000000000000000
function getlength1() public view returns (uint8) {
return num1.length;
}
function getlength2() public view returns (uint8) {
return num2.length;
}
}
string/字符串
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract TestString {
string public myString = "hello";
string public myStringUnicl = unicode"你好"; //unicode 编码
string public myStringUnicl2 = unicode"你好 标签:function,nums,uint256,Solidity,数据类型,uint,数组,public From: https://blog.51cto.com/sleep666/5897786