首页 > 其他分享 >Solidity基础 | 03 一篇文章掌握值类型(布尔型和整型)及其运算

Solidity基础 | 03 一篇文章掌握值类型(布尔型和整型)及其运算

时间:2022-11-15 10:32:41浏览次数:46  
标签:03 运算 Solidity 整数 运算符 uint 整型 类型


导读

区块链这么火,不学一下怎么行?


今天这篇文章将带领大家了解区块链的两种基本值类型——布尔类型和整数类型!讲解类型涉及到的运算以及一些注意问题。让我们一起走进本文看一下吧!


如果你有什么问题,或者有什么想法,欢迎评论与我一起沟通交流。如果你想了解更多有关于区块链相关技术的内容,那就加群:955538712 或者扫描下方二维码加入我们吧!



​ ​ ​ ​ ​


1 类型

我们在后续的代码中会用到各种类型的数据,所以在这里我们先来了解一下相关的类型,方便我们后续学习。

1 类型

Solidity 是一种静态类型语言,这意味着每个变量(状态变量和局部变量)都需要在编译时指定变量的类型。


Solidity 提供了几种基本类型,我们可以应用这些基本类型来组合复杂类型。


需要注意的是,“undefined”或“null”值的概念在Solidity中不存在,但是新声明的变量总是有一个 默认值 ,具体的默认值跟类型相关。在后面我们遇到了会具体说明。

2 类型分类

Solidity中的类型主要包括:


值类型
引用类型
映射


在后面的文章中,我们会详细介绍每种类型。

2 值类型

今天这篇文章我们主要介绍几种常见的值类型,首先先让我们来了解一下值类型吧!

1 值类型

Solidity中一些变量按照值来进行传递,这些变量的类型就是值类型


这些变量被用作函数参数或者赋值语句中,都会进行值拷贝操作。

2 值类型分类

Solidity中的值类型有很多,包括:


布尔类型(布尔型):bool
整数类型(整型):int/uint
定长浮点型:fixed/ufixed
地址类型:address/ddress payable
合约类型
定长字节数组
变长字节数组
地址字面变量
有理数和整数字面常量
字符串字面常量及类型
Unicode字面常量
十六进制字面常量
枚举类型
函数类型


我们在后面,会针对这几个类型,慢慢讲解。

3 bool类型

bool类型我们很常见了,在这里,我们简单说一下。

1 bool类型

bool类型可能的取值为字面常量值 true 和 false 。


bool类型是最简单的数据类型,常用于解决结果为二分类的问题。例如:地址是否合法?交易是否成功?整数是否为素数?

2 bool类型运算符

bool类型主要的运算符就是逻辑运算符关系运算符


支持的逻辑运算符包括:


! :逻辑非
&& :逻辑与, “and”
|| :逻辑或, “or”


支持的关系运算符包括:


== :等于
!= :不等于


3 短路规则

有学过C++的同学,在学习逻辑运算符和表达式,听说过短路(short-circuiting的问题。


没听过也不要紧,可以看下面的文章了解一下:


和C++中的意义,Solidity中的运算符 || 和 && 都遵循同样的短路规则:


f||g,若f为true,则结果一定为true,那么g就不会被执行。
f&&g,若f为false,则结果一定为false,那么g就不会被执行。


有多个语句也是一样:


逻辑或中,前面有true,则true后面的不执行;
逻辑与中,前面有false,则false后面的不执行;

4 整数类型

整数类型基本上是我们学习一门新的编程语言最先接触到,也是最常使用的数据类型。Solidity中的类型和普通编程语言的还有一些区别,具体的,我们一起往下看。

1 整数类型与命名规则

整数类型主要有两种:


int :有符号整数类型,
uint :无符号整数类型。


Solidity中支持uint8到uint256的类型和int8到int256的类型,后面的数字表示的是整数的位数,必须是8的倍数,例如:


uint16,uint128,int32,int64


不同的类型的数据的取值范围不同,例如uint8的取值范围为 0到


2 关系运算与位运算

整型支持关系运算位运算,我们分别讲解。


首先是关系运算:


关系运算也叫比较运算。返回布尔类型的值,用于比较两个整型数据的大小关系判断两个整数是否相等。整型支持所有的关系运算符:


== , != , <= , < , >= , >


整数类型支持位运算,在Solidity中,位运算符包括普通位运算符移位运算符


普通运算符:&(按位与),|(按位或),^(按位异或), ~ (按位取反)
位运算符:<<(左移位), >>(右移位)


位运算不是原数值直接运算,而是转化为二进制数据,在数字的二进制补码表示上执行


3 算术运算与取类型最值

算术运算符


算术运算有很多,也非常重要,算术运算符有如下几个:


-(负号)
+(加),-(减),*(乘),/(除),%(取余/取模),**(幂运算)


我们举几个简单的例子:


uint x = 5 + 2; // equal to 5+2 = 7 
uint x = 5 - 2; // equal to 5-2 = 3
uint x = 5 * 2; // equal to 5*2 = 10
uint x = 8 / 2; // equal to 8/2 = 4
uint x = 13 % 5; // equal to 13%5 = 3
uint x = 5 ** 2; // equal to 5^2 = 25


虽然这些很简单,但是还是要注意一些问题:


问题1:普通除法必须要整除,否则使用显式转换。


在Solidity中使用如下代码会报错:


uint x = 8 / 3;


报错原因是:类型 8 / 3 不能隐式转换为预期类型 uint256。如果实在想用可以使用显式转换:


uint x = uint(8) / uint(3); //x的值为2


对于这里整型和整型的运算得到的结果是整型,后面我们讲到字面常量,字面常量的出发会保留小数位


问题2:关于数据的溢出问题


0.8.0 开始,算术运算有两个计算模式:一个是 “wrapping”(截断)模式或称 “unchecked”(不检查)模式,一个是”checked” (检查)模式。 默认情况下,算术运算在 “checked” 模式下,即都会进行溢出检查,如果结果落在取值范围之外,调用会通过失败异常<assert-and-require>回退。可以通过 unchecked { … }切换到 “unchecked”模式。一般来说,我们都要注意这个问题,保证数据不溢出


问题3:关于0


关于0,要注意如下几个点:


0不能做除数;
不能对0取模;
0**0(0的0次方)在Solidity中的定义为1。


问题4:关于次方的连用


对于下面的表达式。在不同的版本,表达的含义不同:


x**y**z


为了防止自己搞混,我建议,如果你想表达  ,那就用:(x**y)**z,如果你想表达  ,那就用x**(y**z)。


取类型最值


Solidity还支持获取类型的最值:


type(X).min 获取这个类型的最小值;
type(X).max 获取这个类型的最大值。


说在后面的话

这篇文章到这里就要结束啦,希望大家能够通过这篇文章,能够了解并掌握bool类型和整数类型,掌握这两种类型的相关运算,特别是要注意需要注意的一些事项,能够将两种类型熟练应用于后面的实战中!


让我们在后续的课程中,再接再厉,学习更多知识吧。


​ ​ ​ ​ ​


AI与区块链技术

Solidity基础 | 03 一篇文章掌握值类型(布尔型和整型)及其运算_整型

长按二维码关注​

标签:03,运算,Solidity,整数,运算符,uint,整型,类型
From: https://blog.51cto.com/u_12001271/5851849

相关文章

  • Solidity基础 | 02 基本合约结构
    导读区块链这么火,不学一下怎么行?今天这篇文章将带领大家了解合约的结构,了解最基本合约,为以后设计功能更加强大的合约打下基础!让我们一起走进本文看一下吧!如果你有什么问题,或......
  • 03.抽象工厂模式
    抽象工厂模式AbstractFactoryPattern在简单工厂之后变化得到了工厂方法模式(A工厂生产商品a,B工厂生产商品b),不同的工厂生产不同的商品还有其他变化,现在有一下场景工厂A......
  • 003.实现用户登录Model层
    1.创建实体类(entity下)packagecom.imooc.oa.entity;publicclassUser{privateLonguserId;//user_idprivateStringusername;privateStringpass......
  • 【EF core】Microsoft.Data.Sqlite.SqliteException:“SQLite Error 14: 'unable to o
    数据库配置错误。将相对地址修改为绝对地址就可以了。提示错误<?xmlversion="1.0"encoding="utf-8"?><configuration><connectionStrings><addname......
  • Gurobi报错:GurobiError: Unable to retrieve attribute 'X'
    当我试图获得gurobi.optimize()后目标函数的最值(obj.X)的时候,Gurobi报错:GurobiError:Unabletoretrieveattribute'X‘查找原因是因为添加的相关约束使得原函数无解,所......
  • CF903E Swapping Characters
    CF903E:一个复杂度较优的做法首先对于题目情况分类讨论一下,整理出2种主要情况:即分别有3,4个位置不同,对于具体情况直接模拟即可。为什么两个位置不同不行呢?因为无法保证......
  • 题解 HDU4035 【Maze】
    postedon2022-08-1712:33:51|under题解|sourceproblemhttps://vjudge.net/problem/HDU-4035SHY在一棵树上随机游走,从根节点出发,每次有\(k_u\)的几率回到根节......
  • SpringMVC 项目中 创建SpringBoot后,引起的No bean named 'xxx' available
    ​参考:https://blog.csdn.net/weixin_44341110/article/details/115208375https://blog.csdn.net/qq_40929531/article/details/103956332 我是sessionFactory报错......
  • ARC 103 /\/\/\/ 题解
    前缀和一下,就好了#include<bits/stdc++.h>usingnamespacestd;typedefunsignedlonglongull;constintN=1e5+99;inta[N],odd[N],even[N];structcmp{ boolo......
  • ERROR: Timeout after 10 minutes ERROR: Error cloning remote repo 'origin'
    jenkins构建时出现报错,日志输出:ERROR:Timeoutafter10minutesERROR:Errorcloningremoterepo'origin'hudson.plugins.git.GitException:Command"gitfetch--t......