前言:
目前小伙伴们对“无符号整型有负数吗”都比较重视,小伙伴们都需要分析一些“无符号整型有负数吗”的相关知识。那么小编也在网上搜集了一些有关“无符号整型有负数吗””的相关资讯,希望兄弟们能喜欢,你们一起来学习一下吧!solidity数据类型0. 状态变量vs局部变量
定义在合约之内,但是在函数之外的变量,我们叫做状态变量,这些变量是会上传到区块链上保存的。
下面这个合约中的message就是状态变量。
solidity语言没有main函数,只要合约部署到区块链上,就会永不停歇地执行。
// SPDX-License-Identifier: GPL-3.0pragma solidity >=0.7.0 <0.9.0;contract Inbox{ //状态变量 string public message; function setMessage(string memory newMessage) public { //局部变量 string memory tmp = "hello"; message = newMessage; } function getMessage() public view returns(string memory){ return message; }}1. 布尔
go语言: var flag bool , flag = true
bool flag1 ;bool flag2 = false;2. 整型int(有符号整型,有正有负)uint(无符号整型,无负数)以8位为区间,支持int8,int16,int24 至 int256,uint同理。 int默认为int256,uint默认为uint2563. 函数类型
函数类型也就是我们所说的函数,本身也是一个特殊的变量,它可以当做变量赋值,当做函数参数传递,当做返回值。
- 函数声明
函数名,函数签名(返回值,参数类型,修饰符)
- 几个非常非常非常重要的关键字
修饰符
说明
public
公有,任何人(拥有以太坊账户的)都可以调用
private
私有, 只有智能合约内部才可以调用
external
仅合约外部可以调用,合约内部需使用this调用
internal
仅合约内部和继承的合约可以调用
view/constant
函数会读取但是不会修改任何contract的状态变量
pure(纯净的)
函数不使用任何智能合约的状态变量
payable
调用函数需要付钱,钱付给了智能合约的账户
returns
返回值函数声明中使用
- 访问可见性- public、private
修饰为public的状态变量会默认生成一个同名的public函数
- view,constant,pure讲解如果一个函数里面,访问了状态变量,但是没有修改,我们使用view或者constant修饰。如果访问了状态变量,而且修改了,那么就不能constant和view,否则会报错,不修饰即可。如果没有使用过状态变量,我们要修饰为pure。如果你修饰为constant,但是你在函数中修改了,效果是:不会报错,正常执行,但是值不会改变。- payable任何函数,只要修饰为payable,那么就可以在调用这个方法的时候,对value字段赋值,然后将价值value的钱转给合约。若这个函数没有指定payable,但是对value赋值了,那么本次调用会报错。- 匿名函数用于转账
一个合约可以有且只有一个匿名函数,此函数不能有参数,也不能有任何返回值,当我们企图去执行一个合约上没有的函数时,那么合约就会执行这个匿名函数。
当合约在只收到以太币的时候,也会调用这个匿名函数,而且一般情况下会消耗很少的gas,所以当你接收到以太币后,想要执行一些操作的话,你尽可以把你想要的操作写到这个匿名函数里,因为这样做成本非常便宜。
//如果想向合约转账,在合约中添加如下函数即可function() payable { //函数体什么都不填}用于处理不存在的函数合约之间调用,非js调用
contract Test { function() { x = 1; } uint x;}contract Caller { function callTest(address testAddress) { Test(testAddress).call('0xabcdefgh'); // hash does not exist // results in Test(testAddress).x becoming == 1. }}4. 地址(Address)- 概述
以太坊地址的长度,大小为20个字节,20 * 8 = 160位,所以可以用一个uint160编码。地址是所有合约的基础,所有的合约都会继承地址对象,通过合约的地址串,调用合约内的函数。
- 余额(balance)
返回指定地址的余额
// SPDX-License-Identifier: GPL-3.0pragma solidity >=0.7.0 <0.9.0;contract Test { address public addr1 = 0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db; address public addr2 = 0x617F2E2fD72FD9D5503197092aC168c91465E7f2; receive() external payable {} // 向合约账户转账 function transderToContract() payable public { payable(address(this)).transfer(msg.value); } // 获取当前合约的余额 function getBalance1()public view returns(uint256){ return address(this).balance; } // 获取指定地址的余额 function getbalance(address addr) public view returns(uint256){ return addr.balance; } // 由合约向addr1地址转10 eth function transfer() public { payable(addr1).transfer(10*10**18); }}5. 枚举类型(Enums)枚举类型是在Solidity中的一种用户自定义类型。枚举可以将显示的与整数进行转换,但不能进行隐式转换。显示的转换会在运行时检查数值范围,如果不匹配,将会引起异常。枚举类型应至少有一名成员,枚举元素默认为uint8,当元素数量足够多时,会自动变为uint16,第一个元素默认为0,使用超出范围的数值时会报错。
// SPDX-License-Identifier: GPL-3.0pragma solidity >=0.7.0 <0.9.0;contract test { enum WeekDays { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday } WeekDays currentDay; WeekDays defaultday = WeekDays.Sunday; function setDay(WeekDays _day) public { currentDay = _day; } function getDay() public view returns(uint256) { return uint256(currentDay); } function getDefaultDay() public view returns(uint256) { return uint256(defaultday); }}6. 字节数组
[]byte go -> bytes
- 定长的字节数组
solidity内置了一些数组的数据类型:(和go语言做一下对比, var b8 [8]byte),完全只读
bytes1, ... ,bytes32,允许值以步长1递增。==byte默认表示bytes1,byte是类型,bytes是类型,bytes1是内置数组==bytes1只能存储1个字节,即8位的内容,bytes2最多只能存储2个字节,即16位的内容。以此类推...长度可以读取 length(返回bytes5类型的长度,而不是赋值的长度)长度不可以修改可以通过下标访问内容不可修改
内置成员:length,返回数组长度
存储方式:16进制ascii码
标签: #无符号整型有负数吗