Solidity中的基本类型转换(十四)|入门系列

2017/4/29 posted in Solidity入门系列

点击查看原文,获得优化的排版。

  1. 隐式转换

    如果一个运算符能支持不同类型。编译器会隐式的尝试将一个操作数的类型,转为另一个操作数的类型,赋值同理。

一般来说,值类型间的互相转换只要不丢失信息,语义可通则可转换。下面,我们来看一个整数转换的例子:

pragma solidity ^0.4.0;

contract Int{

function conversion() returns (uint16){

uint8 a = 1;

//隐式转换

uint16 b = a;

return (b);

}

}

上面的例子中,我们将一个uint8的变量a隐式的转换为了uint16。同理它还支持转为uint32,uint128和uint256。

另外,无符号整数可以被转为同样,或更大的字节的类型。但需要注意的是,不能反过来转换。由于address是20字节大小,所以它与int160大小是一样。

pragma solidity ^0.4.0;

contract IntToAddress{

function f() returns (uint){

uint160 i = 10;

address addr = i;

return addr.balance;

}

}

上面的例子中,将uint160的i转为了一个address。

  1. 显式转换

    编译器不会将语法上不可转换的类型进行隐式转换,此时我们要通过显式转换的方式,比如将一个有符号整数,转为一个无符号整数。

pragma solidity ^0.4.0;

contract ExplicitConversion{

function f() returns (int8){

uint8 a = 1;

//强制转换
int8 b = int8(a);
return b;

}

}

3. 类型推断

有时为了方便,我们不会显式定义类型。但由于编译器,会自动挑选一个最恰当的类型,所以会常常留下坑,我们来看这个例子:

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;

}

}

大家可以想想上述代码运行的结果。

上述代码运行的结果实际为2100。原因是因为var i = 0定义时,通过类型推断,i的实际类型为uint8,所以它会一直循环,如果没有count >= 2100这个判断语句,这个循环将永远不会结束。

  1. 一些常见的转换方案

    uint转为bytes

    将一个uint转转bytes,可以使用assembly1。

function toBytes(uint256 x) returns (bytes b) {

b = new bytes(32);

assembly { mstore(add(b, 32), x) }

}

上面的转换方式可能是效率最高的方式。

string转为bytes

string可以显示的转为bytes。但如果要转为bytes32,可能只能使用assembly2。

pragma solidity ^0.4.0;

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))

}

}

}

Solidity中的基本类型转换的更多相关文章

  1. 关于Java中的基本数据类型转换

    Java中的基本类型有四种,其中整型分为byte.short.int.long,浮点型分为float.double,字符型char,布尔型boolean.8种类型的级别由低到高byte->sho ...

  2. [转]C++中四种类型转换符的总结

    C++中四种类型转换符的总结 一.reinterpret_cast用法:reinpreter_cast<type-id> (expression)    reinterpret_cast操 ...

  3. C#中的强制类型转换与as转换的区别

    C#中的强制类型转换 例如有ClassA与ClassB两个类创建两个类的对象进行转换 1 2 ClassA a = new ClassA();  ClassB b = new ClassB(); 如果 ...

  4. 【转载】VC++中的图像类型转换--使用开源CxImage类库

    一.CxImage类库简介 这只是翻译了CxImage开源项目主页上的部分简介及简单使用. CxImage类库是一个优秀的图像操作类库.它可以快捷地存取.显示.转换各种图像.有的读者可能说,有那么多优 ...

  5. Solidity 中文文档 —— 第一章:Introduction to Smart Contracts

    第一章:智能合约简介 粗略地翻译了 Ethereum 的智能合约开发语言的文档:Solidity.欢迎转载,注明出处. 有任何问题请联系我,本人微信:wx1076869692,更多详情见文末. 我是 ...

  6. c++ --> c++中四种类型转换方式

    c++中四种类型转换方式   c风格转换的格式很简单(TYPE)EXPRESSION,但是c风格的类型转换有不少缺点, 1)它可以在任意类型之间转换,比如你可以把一个指向const对象的指针转换成指向 ...

  7. Java中的基本类型转换,数据溢出原理

    java中的数据类型 java是一种强类型语言,在java中,数据类型主要有两大类,基本数据类型和引用数据类型,不同的数据类型有不同的数据存储方式和分配的内存大小. 基本数据类型中,各数据类型所表示的 ...

  8. Solidity中uint转string

    在<Solidity中uint转bytes>中,我们知道unit如何转换成bytes,其实把uint转换成string,就是在最后加上string(bytes变量)即可,如下所示: pra ...

  9. Solidity中uint转bytes

    Solidity中uint转bytes方法如下: pragma solidity ^0.4.2; contract Test { function toBytesNickJohnson(uint256 ...

随机推荐

  1. CSS、JavaScript学习过程

    初学JavaScript,通过博客记录自己学习过程中遇到的问题.(包含少量CSS) 零碎记录 JavaScript 输出 type="text/javascript" 那些老旧的实 ...

  2. HSL与RGB颜色转换

    /** * HSL颜色值转换为RGB. * 换算公式改编自 http://en.wikipedia.org/wiki/HSL_color_space. * h, s, 和 l 设定在 [0, 1] 之 ...

  3. 使用JDK开发WebServrice案例

    使用JDK开发WebServrice案例: 一.开发WebService服务器端 第一步:创建Java工程 ,创建相应的包(服务端)使用JDK开发(1.6以上版本) 第二步:建一个接口WebServi ...

  4. Python入门 —— 06语音识别

    Python 语音 实现语音操控的原理 语音操控分为语音识别和语音朗读两部分 我们使用speech模块实现语音模块(python 2.7) SAPI是微软Speech API , 是微软公司推出的语音 ...

  5. Python学习笔记七:文件操作

    文件操作 对照一个word文件的操作方式,来体会文件操作的内容 打开文件:f=open(“file”),提示编码错误,windows默认是GBK f=open(“file”,encoding=”utf ...

  6. centos7 杂记

    yum 源 https://www.cnblogs.com/renpingsheng/p/7845096.html 安装nginx php mysql https://www.cnblogs.com/ ...

  7. error: command 'aarch64-linux-gnu-gcc' failed with exit status 1

    使用jetson tx2安装tensorpack时报错: error: command 'aarch64-linux-gnu-gcc' failed with exit status 1 改正: 如果 ...

  8. ubuntu安装cuda、cudnn

    环境: Ubuntu 16.04.4 LTS CUDA:8.0 CUDNN:5.1 CUDA下载:https://developer.nvidia.com/cuda-80-ga2-download-a ...

  9. ov5640介绍

    1 摄像头 在各类信息中,图像含有最丰富的信息,作为机器视觉领域的核心部件,摄像头被广泛地应用在安防.探险以及车牌检测等场合.摄像头按输出信号的类型来看可以分为数字摄像头和模拟摄像头,按照摄像头图像传 ...

  10. 北京Uber优步司机奖励政策(2月2日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...