Solidity类型转换
类型转换,是一个十分重要,常用的手段。
一.隐式转换
隐式转换,就是当一个运算符能支持不同类型,编译器会隐式的尝试将一个操作数的类型,转为另一个操作数的类型,赋值同理。
条件是:值类型间的互相转换只要不丢失信息,语义可通则可转换。就是说,uint8可转换到uint16、uint32等,但不能反过来。同样的,无符号整数可以被转为同样,或更大的字节的类型。但需要注意的是,不能反过来转换。由于address是20字节大小,所以它与int160大小是一样。【因此可用隐式转换将int160转换到address】
如:
pragma solidity ^0.4.0;
contract Int{
function conversion() returns (uint16){
uint8 a = 1;
//隐式转换
uint16 b = a;
return (b);
}
}
pragma solidity ^0.4.0;
contract IntToAddress{
function f() returns (uint) {
uint160 i = 20;
address addr = i; //int160隐式转换到address
return addr.balance;
}
}
二.显式转换
不能隐式转换是,需要显式转换,如有符号整数转换到无符号整数(8位有符号的负数,转换到无符号8位,则-1 ===> 255, -2===>254 以此类推),即需要添加强制类型转换符号,来实现转换
如:
pragma solidity ^0.4.0;
contract ExplicitConversion{
function f() returns (uint8){
int8 a = -2;
//强制转换
uint8 b = uint8(a);
return b;
}
}
三.使用var的坑
先看下面代码,并推算返回结果:
pragma solidity ^0.4.4;
contract Test{
function a() returns (uint){
uint count = 0;
for (var i = 0; i < 2000; i++) {
count++;
if(count >= 2100){
break;
}
}
return count;
}
}
正常看,循环到1999就结束了,count应该为2000
实际上,返回的count值为2100
原因是,var变量,为编译器自动选择合适的变量,这里选择了uint8,那么i最大255,超过之后又从0开始,因此,仅凭for括号中的条件判断,并不能跳出循环,直到count大于等于2100,才能跳出循环。
四.常用转换方案
1.uint转换到bytes
pragma solidity ^0.4.4;
contract Test{
function toBytes(uint256 x) returns (bytes b) {
b = new bytes(32);
assembly { mstore(add(b, 32), x) }
}
}

2.string转换到bytes
string可以显示的转为bytes。但如果要转为bytes32,可能只能使用assembly
pragma solidity ^0.4.4;
contract StringToBytes{
function StringToBytesVer1(string memory source) returns (bytes result) {
return bytes(source);
}
function stringToBytesVer2(string memory source) returns (bytes32 result) {
assembly {
result := mload(add(source, 32))
}
}
}


文章来源:https://blog.csdn.net/dieju8330/article/details/82992689
Solidity类型转换的更多相关文章
- Solidity中的基本类型转换
Solidity中的基本类型转换(十四)|入门系列 2017/4/29 posted in Solidity入门系列 点击查看原文,获得优化的排版. 隐式转换 如果一个运算符能支持不同类型.编译器会隐 ...
- 智能合约语言 Solidity 教程系列5 - 数组介绍
写在前面 Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合约有所了解, 如果你还不了解,建议你先看以太坊是什么 本文前半部分是参考Solidity官方文档(当前最新版本: ...
- 智能合约语言 Solidity 教程系列8 - Solidity API
这是Solidity教程系列文章第8篇介绍Solidity API,它们主要表现为内置的特殊的变量及函数,存在于全局命名空间里. 写在前面 Solidity 是以太坊智能合约编程语言,阅读本文前,你应 ...
- 【Solidity】学习(4)
solidity函数修饰符 view 没有改变任何值或者写任何东西.只能读取,不能修改 function sayHello() public view returns (string) { } pu ...
- Solidity合约间的调用-1
当调用其它合约的函数时,可以通过选项.value(),和.gas()来分别指定,要发送的ether量(以wei为单位),和gas值. pragma solidity ^; contract InfoF ...
- solidity如何拼接字符串?
当你开始学习使用solidity开发以太坊智能合约之后,很快你会碰到一个问题: 一.在solidity中该如何拼接字符串? 可能你已经试过了,下面的代码试图把两个字符串使用相加的运算符连接起来,但是这 ...
- Solidity 最新 0.5.8 中文文档发布
本文首发于深入浅出区块链社区 热烈祝贺 Solidity 最新 0.5.8 中文文档发布, 这不单是一份 Solidity 速查手册,更是一份深入以太坊智能合约开发宝典. 翻译说明 Solidity ...
- 杂乱的Solidity - 2019-7-13
要清楚在区块链上开发DApp的架构[x][][][][][] DApp是去中心化的应用 基于智能合约 去中心化的游戏规则 代币激励
- solidity基础知识
1.solidity是一种语法类似JavaScript的高级语言,它被设计成以编译的方式生成以太坊虚拟机代码.在后续的内容中你将会发现,使用它很容易创建用于投票.众筹.封闭拍卖.多重签名钱包等等的合约 ...
随机推荐
- linux 配置阿里云yum库
备份当前yum库 mv /etc/yum.repos.d /etc/yum.repos.d.backup4comex 新建yum源配置目录 mkdir /etc/yum.repos.d 设置阿里yum ...
- Codeforces822 C. Hacker, pack your bags!
C. Hacker, pack your bags! time limit per test 2 seconds memory limit per test 256 megabytes input s ...
- Scala_函数式编程基础
函数式编程基础 函数定义和高阶函数 函数字面量 字面量包括整数字面量.浮点数字面量.布尔型字面量.字符字面 量.字符串字面量.符号字面量.函数字面量和元组字面量. scala> val i = ...
- [kuangbin]树链剖分 C - Tree
和平常的树链剖分维护边权不同的地方在于对线段树的要求较高 NEGATE 反转区间,也就是a - b 内所有的边权取相反数 而Query询问是最大值,所以也就是维护可取反区间的最大值问题 需要维护的值是 ...
- java并发的处理方式
1 什么是并发问题. 多个进程或线程同时(或着说在同一段时间内)访问同一资源会产生并发问题. 银行两操作员同时操作同一账户就是典型的例子.比如A.B操作员同时读取一余额为1000元的账户,A操作员为该 ...
- 设置 Nuget 本地源、在线私有源、自动构建打包
设置 Nuget 本地源.在线私有源.自动构建打包 本文演示如果在项目中生成 Nuget 包,并添加 Nuget 本地源,不用发布到 Nuget 服务器.再附带使用在线私有源的简单方法,以及提交代码自 ...
- C# .NET 根据Url链接保存Image图片到本地磁盘
根据一个Image的Url链接可以在浏览器中显示一个图片,如果要通过代码将图片保存在本地磁盘可以通过以下方式: 1.首先获取图片的二进制数组. static public byte[] GetByte ...
- 复习 C++ 中类的函数指针
函数指针这种东西,平时工作中基本上不会用到. 那函数指针会用在哪里? 下面是一些基本的用法,根据消息号调到对应的函数: #include <iostream> #include <m ...
- Java几种单例模式的实现与利弊
饿汉式 提前new出来实例了,并不是在第一次调用get方法时才实例化,没有进行延迟加载 public class Singleton1 { private static Singleton1 inst ...
- 安装openvpn
1.安装服务器端openvpn yum install -y openvpn easy-rsa 如果已存在的yum源中找不安装文件,则可通过以下安装epel yum源 rpm -ivh http:/ ...