侧边栏壁纸
博主头像
秋码记录

一个游离于山间之上的Java爱好者 | A Java lover living in the mountains

  • 累计撰写 123 篇文章
  • 累计创建 256 个标签
  • 累计创建 41 个分类

玩以太坊链上项目的必备技能(基本类型转换以及推断-Solidity之旅六)

某些情况下,编译器不支持隐式转换,而这时,作为开发人员的您就不得不使用强硬手段了。显式转换可能会发生些您无法预料的状况,所以您需要繁琐的测试,看最终是否能达到您的要求。

基本类型之间的转换

熟悉过其他编程语言的您,对基本类型之间的转换并不陌生吧!当然,这基本类型进行转换可分为隐式转换显示转换

隐式转换

Solidity 支持隐式转换,通过编译器自动进行转换,而不要开发人员的干涉,这便是隐式转换

诸如赋值函数传递实参以及运算操作,通常,是可以进行类型之间的隐式转换,且并不会丢失任何数据。

例如:uint8可以转换成uint16,uint16可以转换成uint32uint128可以转换成uint256,但uint8却不能转换成uint256.(因为uint256不能覆盖某些值,比如:-1

假使两个不同类型的值进行操作运算时,编译器则会隐式地将一个类型转换成另一个类型(赋值也是如此),这意味着操作始终是操作数其中一个的类型去执行。

uint8 a = 3;
uint16 b = 4;
uint32 c = a + b;

img

无符号整型可以转换成跟它大小相等或更大的字节类型,但反之不能。 任何可以转换成 uint160 的类型都可以转换成 address 类型。

显式转换

某些情况下,编译器不支持隐式转换,而这时,作为开发人员的您就不得不使用强硬手段了。显式转换可能会发生些您无法预料的状况,所以您需要繁琐的测试,看最终是否能达到您的要求。

int8 y = -3;
uint x = uint(y); //0xfffff..fd (64 个 16 进制字符)  因为这是 -3 的 256 位补码形式。

如果一个类型显式转换成更小的类型,相应的高位将被舍弃

uint32 a = 0x12345678;
uint16 b = uint16(a); // 此时 b 的值是 0x5678

类型推断

类型推导好像是很多编程语言都支持的语法糖吧!无非让您减少代码的编写。

就像Java 8语言设计者好不容易整了个Lambda 表达式,可您却始终没在您的Java代码中去使用它。

苹果(Apple)公司好容易把苹果手机(iphone)设计的越来愈薄,可是到了国内呢,即给手机贴上了膜又让手机套上了那专为手机量身定做的外套,最终这样一来,手机厚了(当然咯,我们还是喜欢厚一点的手机,毕竟拿在手上,能察觉手上确实拿了个东西!)

说到底,类型推到就是为了让开发人员偷下懒,方便声明变量,可不用敲些类型关键字,让其值推导出该变量的类型。

uint24 x = 0x123;
var y = x;

这里 y 的类型将是 uint24。不能对函数参数或者返回参数使用 var

注意:类型只能从第一次赋值中推断出来,因此以下代码中的循环是无限的, 原因是i 的类型是 uint8,而这个类型变量的最大值比 2000 小。 for (var i = 0; i < 2000; i++) { ... }

高版本可能不支持了。

img

玩以太坊链上项目的必备技能(变量作用域-Solidity之旅五)
« 上一篇 2022-12-11
玩以太坊链上项目的必备技能(单位以及全局变量-Solidity之旅七)
下一篇 » 2022-12-14

相关推荐

  • 玩以太坊链上项目的必备技能(变量作用域-Solidity之旅五) 2022-12-11 21:12:12 +0800 CST
  • 玩以太坊链上项目的必备技能(类型-映射类型-Solidity之旅四) 2022-12-10 20:49:38 +0800 CST
  • 玩以太坊链上项目的必备技能(类型-引用类型-Solidity之旅三) 2022-12-09 20:56:45 +0800 CST
  • 玩以太坊链上项目的必备技能(类型-值类型-Solidity之旅二) 2022-12-06 21:52:25 +0800 CST
  • 玩以太坊链上项目的必备技能(初识智能合约语言-Solidity之旅一) 2022-12-05 22:34:42 +0800 CST