Solidity拓展:数据类型的转换

 

1.数据类型隐式转换 (自动)

同一类型之间的转换:由低长度转换为高长度int8-int16-int32······int256,但int不能自动转换成uint,因为放不下负数所以直接不让转换,且 int8 不能转换成 uint256 (因为 uint256 不能涵盖某些值,例如, -1)。

下面加法的操作数 y 和 z 没有相同的类型,但是 uint8 可以被隐式转换为 uint16,相反却不可以。 因此, 在执行加法之前,将 y 转换为 z 的类型, 在 uint16 类型中。 表达式  y + z 的结果类型是 uint16 。 在执行加法之后。 因为它被赋值给 uint32 类型的变量,又进行了另一个隐式转换.

uint8 y;
uint16 z;
uint32 x = y + z;

2.数据类型显示转换(强制)        

如果某些情况下编译器不支持隐式转换,但是你很清楚你要做什么,这种情况可以考虑显式转换。 注意这可能会发生一些无法预料的后果,因此一定要进行测试,确保结果是你想要的!

1.将一个 int8 类型的负数转换成 uint

int8 y = -3;
uint x = uint(y);

这段代码的最后,x 的值将是 0xfffff..fd (64 个 16 进制字符),因为这是 -3 的 256 位补码形式。

 

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

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

3.如果将整数显式转换为更大的类型,则将填充左侧(即在更高阶的位置)。 转换结果依旧等于原来整数

uint16 a = 0x1234;
uint32 b = uint32(a); // b 为 0x00001234 now
assert(a == b);

定长字节数组转换则有所不同, 他们可以被认为是单个字节的序列和转换为较小的类型将切断序列

bytes2 a = 0x1234;
bytes1 b = bytes1(a); // b 为 0x12

1.如果将定长字节数组显式转换为更大的类型,将按正确的方式填充。 以固定索引访问转换后的字节将在和之前的值相等 (如果索引仍然在范围内):

bytes2 a = 0x1234;
bytes4 b = bytes4(a); // b 为 0x12340000
assert(a[0] == b[0]);
assert(a[1] == b[1]);

因为整数和定长字节数组在截断(或填充)时行为是不同的, 如果整数和定长字节数组有相同的大小,则允许他们之间进行显式转换, 如果要在不同的大小的整数和定长字节数组之间进行转换 ,必须使用一个中间类型来明确进行所需截断和填充的规则:
bytes2 a = 0x1234;
uint32 b = uint16(a); // b 为 0x00001234
uint32 c = uint32(bytes4(a)); // c 为 0x12340000
uint8 d = uint8(uint16(a)); // d 为 0x34
uint8 e = uint8(bytes1(a)); // e 为 0x12

3.字面常量与基本类型的转换

整型与字面常量转换

十进制和十六进制字面常量可以隐式转换为任何足以表示它而不会截断的整数类型

uint8 a = 12; //  可行
uint32 b = 1234; // 可行
uint16 c = 0x123456; // 失败, 会截断为 0x3456

定长字节数组与字面常量转换

十进制字面常量不能隐式转换为定长字节数组。十六进制字面常量可以是,但仅当十六进制数字大小完全符合定长字节数组长度。 不过零值例外,零的十进制和十六进制字面常量都可以转换为任何定长字节数组类型:

bytes2 a = 54321; // 不可行
bytes2 b = 0x12; // 不可行
bytes2 c = 0x123; // 不可行
bytes2 d = 0x1234; // 可行
bytes2 e = 0x0012; // 可行
bytes4 f = 0; // 可行
bytes4 g = 0x0; // 可行

字符串字面常量和十六进制字符串字面常量可以隐式转换为定长字节数组,如果它们的字符数与字节类型的大小相匹配:

bytes2 a = hex"1234"; // 可行
bytes2 b = "xy"; // 可行
bytes2 c = hex"12"; // 不可行
bytes2 d = hex"123"; // n不可行
bytes2 e = "x"; // 不可行
bytes2 f = "xyz"; // 不可行

4.有关地址类型的数据转换

  • 通过校验和测试的正确大小的十六进制字面常量会作为 address 类型。 
  • 只有 bytes20 和 uint160 允许显式转换为 address 类型 
  • 从 bytes20 或其他整型显示转换为 address 类型时,都会作为 address payable 类型。 
  • 一个地址 address a 可以通过 payable(a) 转换为 address payable 类型.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spark集群的运行基本流程是怎样的?

Spark集群的运行架构 Spark是基于内存计算的大数据并行计算框架,比MapReduce计算框架具有更高的实时性,同时具有高效容错性和可伸缩性,在学习Spark操作之前,首先介绍Spark运行架构,如图所示。 在上图中,Sp…

“数字”厨电成新宠?“传统”厨电如何凭实力年销破百亿?|厨房电器SMI社媒心智品牌榜

Social Power 核心解读 AI加持,数字厨电新物种持续走红 传统厨电发力社媒,“有范儿”实力吸睛 4月中下旬的“魔都”可谓热闹非凡,上海车展喧嚣未落,隔壁2023AWE(中国家电及消费电子博览会)的群雄逐鹿紧随…

PCIE知识点-022:PCIe 时钟结构

图1:参考时钟结构示意图[4] 1. Common Refclk Architecture Common Refclk Architecture,即同源参考时钟架构,PCIe收发设备共用一个时钟源,是目前是使用最为广泛的方案。 缺点: 对于适用同一 Common Clock 作为参考时…

新冠又临“涨潮”期,看我AI显身手

#疫情#北京时间5月24日,北京市卫生健康委发布2023年第20周疫情周报。报告显示,2023年第20周全市共报告法定传染病14种25544例,死亡1例。报告病例数居前5位的病种依次为:新型冠状病毒感染、其它感染性腹泻病、流行性感冒、肺结核和病毒性肝炎&…

chatgpt赋能python:Python请求头——让你的网络请求更有效率

Python请求头——让你的网络请求更有效率 网络请求是现代应用程序的核心。但是,如果你不了解Python请求头的概念和用途,那么你可能会面临一些棘手的问题。在本文中,我们将深入探讨Python请求头,了解其作用、语法和最佳实践。 什…

GPT-4平替版:MiniGPT-4,支持图像理解和对话,现已开源

项目地址:https://minigpt-4.github.io/ 论文链接:https://github.com/Vision-CAIR/MiniGPT-4/blob/main/MiniGPT_4.pdf 代码:https://github.com/Vision-CAIR/MiniGPT-4 视频:https://youtu.be/__tftoxpBAw 数据集&#xff…

推荐|x86视觉运动控制一体机VPLC710

正运动技术始终围绕客户需求不断迭代升级产品及开发,积极探索工控自动化高质量发展新路径,着眼于全力为客户提供更优质的产品与服务,特此开发了一款可满足全场景高速高精及中大型产线设备应用需求的x86的IPC形态控制器。 VPLC710产品简介 VP…

【JavaSE】Java基础语法(九):封装

文章目录 ☔1. private关键字☔2. private关键字的使用☔3. this关键字☔4. this内存原理☔5. 封装思想 ☔1. private关键字 概述 : private是一个修饰符,可以用来修饰成员(成员变量,成员方法) 特点 : 被private修饰的成员&…

Git的使用

Git 概念 版本控制 软件版本: JDK:1.8,17,20 MYSQL:5.7,8.0 IDEA:2022,2023 文件版本: 保存重要的历史记录,恢复数据 版本控制软件的基础功能 保存…

创新管理工具:低代码平台在学校管理中的应用实践

随着信息技术的不断发展,学校管理也随之发生了变革。传统的学校管理方式往往是依靠人工操作,存在信息不透明、效率低下等问题,而数字化管理的出现,可以帮助学校提高管理效率、降低管理成本、提升数据统计和分析能力。而低代码技术…

EDR(端点、端点检测与响应中心、可视化展现)

EDR基本原理与框架 EDR定义 端点检测和响应是一种主动式端点安全解决方案,通过记录终端与网络事件(例如用户,文件,进程,注册表,内存和网络事件),并将这些信息本地存储在端点或集中数…

hive如何实现oracle中复杂的update sql

hive3.1有update语法,但是目前没用还是采用的非事务表,所以我们用其他的办法来解决hive的update问题 简单的update oracle update student set namecclovezbf where id1 hive insert overwrite table student select id, if(id1,cclovezbf,name) n…

LeetCode 49 字母异位词分组

LeetCode 49 字母异位词分组 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/group-anagrams/description/ 博主Github:https://github.com/GDUT-Rp/LeetCode 题目: 给你一个字符串数组&#x…

PowerShell系列(四):PowerShell进入交互环境的三种方式

目录 1、Win键X 方式 2、使用微软自带的搜索功能 3、命令行运行方式 4、命令行窗口方式 5、使用第三方命令行软件(Terminal)开启PowerShell环境 6、PowerShell交互环境执行脚本的一些优势 7、小技巧 今天继续给大家讲解PowerShell相关的知识&…

发现一个好玩的东西:Markdown 使用 Emoji 表情

Markdown 使用 Emoji 表情 玩法1、复制和粘贴表情符号2、使用表情符号简码Markdown 定义列表 玩法 有两种方法可以将表情符号添加到Markdown文件中: 将表情符号复制并粘贴到Markdown格式的文本中或者键入emoji shortcodes。 1、复制和粘贴表情符号 在大多数情况…

鸿蒙Hi3861问题解决-[OHOS ERROR] clang not found, install it please

一、简介 在使用DevEco进行编译时出现[OHOS ERROR] clang not found, install it please问题,导致编译失败,这里做个问题记录。 二、解决 这种问题其实还是工具链安装不全造成的。 安装gn 这里用的是VSCode DevEco组件,里边包含了gn组件的安…

【分立元件】MOSFET如何用于同步整流

在电力电子中我们会使用二极管做开关,当二极管导时,相当于开关闭合,当二极管截止时,相当于开关断开。但是二极管在导通时的管压降在低压电源电路中是一个损耗来源,所以一般我们首选使用的是肖特基二极管,因为肖特基二极管的管压降比较低。 如下所示为非同步BUCK电源拓朴…

mybatis-plus实现逻辑删除(详细!)

文章目录 什么是逻辑删除?为什么用到逻辑删除?在springboot使用Mybatis-Plus提供的逻辑删除1、在application.yml配置2、 实体类字段上加上TableLogic注解演示 什么是逻辑删除? 逻辑删除的本质是修改操作,并不是真正的删除&#…

如何在华为OD机试中获得满分?Java实现【报数游戏】一文详解!

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Java华为OD机试真题(2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述4. Java算法源码5. 测试6.解题思路1. 题目描述 100个人围成一圈,每个人…

多线程 -- 线程安全问题(3)

本篇重点: 总结线程安全问题的原因以及解决办法 目录 synchronized 加锁关键字join 和 synchronized 的区别volatile 关键字 在上一篇中我们介绍了Thread类的基本使用方法, 本篇将会介绍有关于线程的安全问题 线程不安全的原因: 抢占式执行(罪魁祸首, 万恶之源) 多个线程修改同…