Solidity中的基本类型转换

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;

}
}

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

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

转载于:https://www.cnblogs.com/xiaocongcong888/p/9829592.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/365288.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

雷霆战机

前言 多年前&#xff0c;你我在一起"打飞机"。为了实现真正的打飞机&#xff0c;在下一年前踏足帝都学习了无所不能的Python&#xff0c;辣么接下来带你在俩个小时用200行代码学会打飞机。 python中提供了一个pygame的模块能够让我们快速编写一个游戏。接下来&#x…

FancyBox - 经典的 jQuery Lightbox 插件

FancyBox 是一款非常优秀的弹窗插件&#xff0c;能够为图片、HTML 内容和其它任务的多媒体内容提供优雅的弹出缩放效果。作为是最流行的 Lightbox 插件之一&#xff0c;可以通过 fitToView 实现自适应功能。主要特色&#xff1a; ✓ 能够显示图片、HTML 元素、SWF 影片、ifra…

edger多组差异性分析_简单使用DESeq2/EdgeR做差异分析

DESeq2和EdgeR都可用于做基因差异表达分析&#xff0c;主要也是用于RNA-Seq数据&#xff0c;同样也可以处理类似的ChIP-Seq,shRNA以及质谱数据。这两个都属于R包&#xff0c;其相同点在于都是对count data数据进行处理&#xff0c;都是基于负二项分布模型。因此会发现&#xff…

php如何表格中的变为超链接,php中将网址转换为超链接的函数

php中将网址转换为超链接的函数复制代码 代码如下:function showtext($text){$search array(|(http://[^ ])|, |(https://[^ ])|, |(www.[^ ])|);$replace array($1, $1, $1);$text preg_replace($search, $replace, $text);return $text;}时间&#xff1a; 2011-08-311.根据…

Java面试参考指南–第1部分

JAVA面向对象的概念 Java基于面向对象的概念&#xff0c;它允许更高级别的抽象以实际方式解决任何问题。 面向对象的方法将实际对象中的问题解决方案概念化&#xff0c;从而更易于在整个应用程序中重用。 例如椅子&#xff0c;风扇&#xff0c;狗&#xff0c;电脑等。 在Java…

6.5 开始进入设计 … Transition to Design

开始进入设计 … Transition to Design  从需求分析到设计  逻辑架构与子系统 Logical Architecture and sub-system 5.1 向设计过程切换 Transition to Design  需求与领域分析阶段During requirements and domain analysis work  做正确的事情 “Do the right thing”…

搜索引擎优化系统知名乐云seo_seo技术出名 乐云seo:如何进行搜索引擎优化?

搜索引擎提升是如何进行的?成都seo发现现如今的搜索引擎都存在很多 的网站 以及內容&#xff0c;SEOer平时进行网站提升的状况下全是感受到这一点&#xff0c;要想在众多的网站內容中找寻本身要想的是没法的&#xff0c;因而搜索引擎会进行一定的提升&#xff0c;搜索引擎本身…

Odyssey.js – 使用现成模板在线创建互动的故事

Odyssey.js 是一个开源工具&#xff0c;它可以让你的地图&#xff0c;叙述和其他多媒体结合成一个美丽的故事。创建新的故事很简单&#xff0c;要求无非是一个现代的 Web 浏览器和一个好的想法。你可以使用现成的模板来控制和设计精美的布局&#xff0c;让你的故事的整体外观和…

100层楼扔两个鸡蛋的问题

转载自&#xff1a;http://blog.sina.com.cn/s/blog_6c813dbd0101bh98.html 两个软硬程度一样但未知的鸡蛋&#xff0c;它们有可能都在一楼就摔碎&#xff0c;也可能从一百层楼摔下来没事。 有座100层的建筑&#xff0c;要你用这两个鸡蛋确定哪一层是鸡蛋可以安全落下的最高位置…

Matlab看跌期权二叉树,欧式期权二叉树MATLAB程序

欧式期权二叉树MATLAB程序function EXS()Sinput(请输入当前股价&#xff1a;\n);Kinput(请输入股票执行价格&#xff1a;\n);rinput(请输入无风险利率&#xff1a;\n);thetainput(请输入波动率&#xff1a;\n);Tinput(请输入到期时间&#xff1a;\n);bcinput(请输入步长&#x…

Java 8 Friday Goodies:Lambda和SQL

在 Data Geekery &#xff0c;我们喜欢Java。 而且&#xff0c;由于我们真的很喜欢 jOOQ的流畅的API和查询DSL &#xff0c;我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 我们已经 写了一些关于Java 8好东西的博客 &#xff0c;现在我们觉得是时候开始一个新的博客系…

酷毙了!三种风格的全屏幻灯片效果【附源码下载】

今天&#xff0c;我们想向您展示如何创建平铺背景图像的幻灯片效果。其灵感来自于国外的一个工作室网站&#xff08;围观&#xff09;&#xff0c;这个网站充满了各种有趣和创意效果&#xff0c;一定记得去看看。 这个幻灯片效果是由四个区域的独立移动构成&#xff0c;通过画面…

VMware卸载有残留,再安装时报错提示MSI Failed

引用自吾爱破解论坛&#xff1a;https://www.52pojie.cn/thread-455779-1-1.html 解决方法&#xff1a;软件自动清理法&#xff1b; 软件 地址&#xff1a;下载地址1&#xff1a;链接&#xff1a;http://pan.baidu.com/s/1ntzAR7j 密码&#xff1a;a8ug备用&#xff1a;http://…

基本函数依赖和候选键_[总结]关系数据库设计基础(函数依赖、无损连接性、保持函数依赖、范式、……)...

联系(Relationship)1:1联系&#xff1a;如果实体集E1中的每个实体最多只能和实体集E2中一个实体有联系&#xff0c;反之亦然&#xff0c;那么实体集E1对E2的联系成为一对一联系&#xff0c;记为1:1&#xff1b;1&#xff1a;N联系&#xff1a;一对多&#xff0c;记为1&#xff…

使用Mockito模拟自动装配的字段

依赖注入是诸如Spring和EJB之类的Control容器反转的非常强大的功能。 将注入的值封装到私有字段中总是一个好主意。 但是&#xff0c;自动连线字段的封装会降低可测试性。 我喜欢Mockito解决此问题以模拟自动装配字段的方式。 将在示例中进行解释。 &#xff08;此博客文章希望…

西游之路——python全栈——CRM项目之表结构设计

一、表结构设计 1 from django.db import models2 from django.contrib.auth.models import User3 4 """自带验证"""5 class UserProFile(models.Model):6 """用户信息表"""7 user models.OneToOneField…

你见过吗?9款超炫的复选框(Checkbox)效果

复选框&#xff08;Checkbox&#xff09;在各个浏览器中的效果不一致&#xff0c;因此很多 Web 开发人员会自己重新设计一套界面和使用体验都更佳的复选框功能。下面就给大家分享9款超炫的复选框&#xff08;Checkbox&#xff09;效果&#xff0c;纯 CSS3 实现&#xff0c;未使…

系统制成docker镜像_docker镜像原理 镜像制作 dockerfile

为什么一个centos镜像只有两百多兆&#xff0c;而tomcat镜像五百多兆1.先说说操作系统操作系统组成部分&#xff1a;进程调度子系统进程通信子系统内存管理子系统设备管理子系统文件管理子系统网络通信子系统作业控制子系统Linux文件系统由bootfs和rootfs两部分组成bootfs&…

linux的vi命令详解,Linux上Vi命令详解

Linux下Vi命令详解补充一点&#xff1a;在vi中使用命令的方法是&#xff1a;冒号命令回车&#xff0c;如:q 回车代表退出。这里有一本0分下载关于Vi详细介绍的书&#xff1a;http://download.csdn.net/detail/zqiang_55/4399731文本编辑器是所有计算机系统中最常用的一种工具。…

jpg、gif、png-8、png-24的区别

一、gif格式的特点 1、透明性。gif是一种布尔透明类型&#xff0c;即它可以是全透明&#xff0c;也可以是全不透明&#xff0c;但是没有半透明 2、动画。gif支持动画 3、无损耗性。gif是一种无损耗的图像格式&#xff0c;这意味着你可以对gif图片做任何操作也不会使图片质量产生…