文章目录
前言
写本文的目的是记录自己对于区块链技术的学习,方便日后查漏补缺,solidity是一门智能合约语言,是静态类型语言,支持继承等特性。solidity中不存在 undefine和null的概念,每个新声明的变量都会根据其类型赋予默认值。值类型(value types)之所以有此名称是因为他们总是通过值传递,当他们用作函数参数或者赋值时总是以拷贝的方式。
一、布尔类型;
1、可取字面量:
- false
- true
2、操作符:
- ! (非)
- && (与)
- || (或)
- == (等于)
- != (不等于)
&&和||遵循着相同的短路规则
二、整数类型
1、整数有无符号整数(uint)和有符号整数(int)两种,int8-int256(int)\uint8-uint256(uint),以1个字节逐步递进。
2、运算符
- 比较:<=、=>、==、!=、>、<。(返回值为bool尅性)
- 位运算:&(与)、|(或)、^(异或)、~(按位取反)
- 移位运算:<<(左移位)、>>(右移位) (~int256(0)== int256(-1))
- 算数运算符:+、-、*、/、%、**
对于整型type(uint\int).min、type(uint\int).max可以获取做大值最小值。
溢出攻击:在0.8版本之前,solidity不检查溢出,容易发生溢出攻击,所以编写时需要用Safemath库,0.8之后算术运算有两个模式一个是“wrapping”截断模式,不检查溢出。另一个是检查模式(默认),发生溢出时会发生Panic(assert)错误,evm会revert所有操作。通过unchecked {……} 可以强制使用wrappinng模式,禁用掉Panic错误(1、可以事先用require确认是否会溢出。2、除零会直接报Panic)。
3、 移位运算
移位操作的结果具有左操作数的类型,同时会截断结果以匹配类型。 右操作数必须是无符号类型。
移位可以通过用2的幂的乘法来 “模拟”,左操作数的截断总是在最后发生,但是不会明确提醒。
x << y
等于数学表达式x*2**y
。x >> y
等于数学表达式x/2**y
, 四舍五入到负无穷。
在版本
0.5.0
之前,对于负x
的右移x >> y
相当于x / 2 ** y
,会四舍五入到零,而不是向负无穷。
4、使用两进制补码表示数据
有int x = type(int).min;
则