知乎专栏 | 多维度架构 |
int/uint:变长的有符号或无符号整型。变量支持的步长以8递增,支持从uint8到uint256,以及int8到int256。需要注意的是,uint和int默认代表的是uint256和int256。
有符号整型能够表示负数的代价是其能够存储正数的范围的缩小,因为其约一半的数值范围要用来表示负数。如:uint8的存储范围为0 ~ 255,而int8的范围为-127 ~ 127
支持的运算符:
比较:<=,<,==,!=,>=,>,返回值为bool类型。
位运算符:&,|,(^异或),(~非)。
数学运算:+,-,一元运算+,*,/,(%求余),(**次方),(<<左移),(>>右移)。
小数由"."组成,在他的左边或右边至少要包含一个数字。如"1.",".1","1.3"均是有效的小数。
pragma solidity ^0.4.25; //Author: netkiller <netkiller@msn.com> //Home: http://www.netkiller.cn contract Math { function mul(int a, int b) public pure returns (int) { int c = a * b; return c; } function div(int a, int b) public pure returns (int) { int c = a / b; return c; } function sub(int a, int b) public pure returns (int) { return a - b; } function add(int a, int b) public pure returns (int) { int c = a + b; return c; } }
pragma solidity ^0.4.25; //Author: netkiller <netkiller@msn.com> //Home: http://www.netkiller.cn contract Math { function m(int a, int b) public pure returns (int) { int c = a % b; return c; } }
pragma solidity ^0.4.25; //Author: netkiller <netkiller@msn.com> //Home: http://www.netkiller.cn contract Math { function m(uint a, uint b) public pure returns (uint) { uint c = a**b; return c; } }
pragma solidity ^0.4.25; //Author: netkiller <netkiller@msn.com> //Home: http://www.netkiller.cn contract Math { function yu() public pure returns (uint) { uint a = 3; // 0b0011 uint b = 4; // 0b0100 uint c = a & b; // 0b0000 return c; // 0 } function huo() public pure returns (uint) { uint a = 3; // 0b0011 uint b = 4; // 0b0100 uint c = a | b; // 0b0111 return c; // 7 } function fei() public pure returns (uint8) { uint8 a = 3; // 0b00000011 uint8 c = ~a; // 0b11111100 return c; // 0 } function yihuo() public pure returns (uint) { uint a = 3; // 0b0011 uint b = 4; // 0b0100 uint c = a ^ b; // 0b0111 return c; // 252 } }
pragma solidity ^0.4.25; //Author: netkiller <netkiller@msn.com> //Home: http://www.netkiller.cn contract Math { function leftShift() public pure returns (uint8) { uint8 a = 8; // 0b00001000 uint8 c = a << 2; // 0b00100000 return c; // 32 } function rightShift() public pure returns (uint8) { uint8 a = 8; // 0b00001000 uint8 c = a >> 2; // 0b00000010 return c; // 2 } }
a << n 表示a的二进制位向左移动n位,在保证位数没有溢出的情况下等价于 a乘以2的n次方。
a >> n 表示a的二进制位向右移动n位,在保证位数没有溢出的情况下等价于 a除以2的n次方。
string 字符串类型,字符串可以通过""或者''来定义字符串的值
pragma solidity ^0.4.25; //Author: netkiller <netkiller@msn.com> //Home: http://www.netkiller.cn contract StringTest { string name; function StringTest() public{ name = "default"; } function setName(string _name) public{ name = _name; } function getName() public view returns(string){ return name; } }
在 Solidity 中想获得字符串长度必须转成 bytes 类型然后使用 length 属性获得。bytes(string).length
pragma solidity ^0.4.25; //Author: netkiller <netkiller@msn.com> //Home: http://www.netkiller.cn contract StringTest { string public name = "http://www.netkiller.cn"; function nameBytes() public constant returns (bytes) { return bytes(name); } function nameLength() public constant returns (uint) { return bytes(name).length; } function length(string _name) public pure returns (uint) { return bytes(_name).length; } }
提示 | |
---|---|
注意:汉字采用UTF8编码,一个汉字等于3个字节,当你使用 length("景峯") 测试时会返回长度 6。 |
bool: 可能的取值为常量值true和false。支持的运算符:
! 逻辑非 && 逻辑与 || 逻辑或 == 等于 != 不等于 bool a = true; bool b = !a; // a == b -> false // a != b -> true // a || b -> true // a && b -> false
bytes names = "netkiller" bytes9 _names = "netkiller"; bytes(name)[0] = 0xFF; bytes memory _tmp = new bytes(3); _tmp[0] = 0x4e; _tmp[1] = 0x65; _tmp[2] = 0x6f;
pragma solidity ^0.4.25; //Author: netkiller <netkiller@msn.com> //Home: http://www.netkiller.cn contract BytesTest { bytes names = "netkiller"; function get() public view returns (bytes) { return names; } function getBytes2() public pure returns (bytes2) { bytes9 _names = "netkiller"; return bytes2(_names); } function bytesToString() public constant returns (string) { return string(names); } function copyBytes(bytes b) public pure returns (bytes) { bytes memory tmp = new bytes(b.length); for(uint i = 0; i < b.length; i++) { tmp[i] = b[i]; } return tmp; } function bytesToString2() public pure returns (string) { bytes memory _tmp = new bytes(3); _tmp[0] = 0x4e; _tmp[1] = 0x65; _tmp[2] = 0x6f; return string(_tmp); } }
.length可以动态修改字节数组的长度
pragma solidity ^0.4.25; //Author: netkiller <netkiller@msn.com> //Home: http://www.netkiller.cn contract BytesTest2 { // 初始化一个两个字节空间的字节数组 bytes public array = new bytes(2); // 设置修改字节数组的长度 function setLength(uint _len) public { array.length = _len; } // 返回字节数组的长度 function getLength() constant public returns (uint) { return array.length; } // 往字节数组中添加字节 function pushArray(byte _tmp) public{ array.push(_tmp); } }
//创建一个memory的数组 uint[] memory a = new uint[](7); uint[] x = [uint(1), 3, 4]; bytes memory b = new bytes(10);
二维数组
uint [2][3] T = [[1,2],[3,4],[5,6]];
pragma solidity ^0.4.25; //Author: netkiller <netkiller@msn.com> //Home: http://www.netkiller.cn contract ArrayTest { uint [] array = [1,2,3,4,5]; // 通过for循环计算数组内部的值的总和 function sum() constant public returns (uint) { uint num = 0; for(uint i = 0; i < array.length; i++) { num = num + array[i]; } return num; } function sumNumbers(uint[] _numbers) public pure returns (uint) { uint num = 0; for(uint i = 0; i < _numbers.length; i++) { num = num + _numbers[i]; } return num; } }
.length 属性是活动数组的尺寸
pragma solidity ^0.4.25; //Author: netkiller <netkiller@msn.com> //Home: http://www.netkiller.cn contract ArrayLength { uint [] array = [1,2,3,4,5]; function getLength() public constant returns (uint) { return array.length; } }
通过 push 可以向数组中添加数据
pragma solidity ^0.4.25; //Author: netkiller <netkiller@msn.com> //Home: http://www.netkiller.cn contract ArrayLength { uint [] array = [1,2,3,4,5]; function pushArray() public { array.push(6); } function getLength() public constant returns (uint) { return array.length; } }
State 就是一个自定义的整型,当枚举数不够多时,它默认的类型为uint8,当枚举数足够多时,它会自动变成uint16,枚举下标定义从左至右从零开始。
New=0, Pending=1, Done=2, Deleted=3
访问枚举方式 State.New 实际等于数字 0
pragma solidity ^0.4.25; //Author: netkiller <netkiller@msn.com> //Home: http://www.netkiller.cn contract EnumTest { enum State { New, Pending, Done, Deleted } State state = State.New; function set(State _state) public { state = _state; } function get() constant public returns (State) { return state; } }
枚举用来定义状态
pragma solidity ^0.4.0; contract Purchase { enum State { Created, Locked, Inactive } // Enum }
定义结构体
struct Voter { uint weight; // weight is accumulated by delegation bool voted; // if true, that person already voted address delegate; // person delegated to uint vote; // index of the voted proposal } // This is a type for a single proposal. struct Proposal { bytes32 name; // short name (up to 32 bytes) uint voteCount; // number of accumulated votes }
演示例子
pragma solidity ^0.4.25; //Author: netkiller <netkiller@msn.com> //Home: http://www.netkiller.cn contract Students { struct Person { string name; uint age; uint class; } Person person = Person("Neo",18,1); function getPerson() public view returns(string){ return person.name; } }
Struct 不知直接返回,解决方法如下
pragma solidity ^0.4.19; //Author: netkiller <netkiller@msn.com> //Home: http://www.netkiller.cn contract Netkiller { struct JobStruct { uint a; uint b; uint c; } function getValues () public pure returns (uint, uint, uint) { JobStruct memory js = JobStruct(1, 2, 3); return (js.a, js.b, js.c); } }
address public minter;
下面是一个获得账号余额的例子。
pragma solidity ^0.4.25; //Author: netkiller <netkiller@msn.com> //Home: http://www.netkiller.cn contract AddressTest{ function getBalance(address _addr) public constant returns (uint){ return _addr.balance; } }
mapping 就是图数据结构,由 key 和 value 组成。
pragma solidity ^0.4.25; //Author: netkiller <netkiller@msn.com> //Home: http://www.netkiller.cn contract MappingExample { mapping(uint => string) map; function put(uint key, string value) public { map[key] = value; } function get(uint key) constant public returns (string) { return map[key]; } }