u32转换bool类型_4.29.类型转换

类型转换

casting-between-types.md

commit 6ba952020fbc91bad64be1ea0650bfba52e6aab4

Rust,和它对安全的关注,提供了两种不同的在不同类型间转换的方式。第一个,as,用于安全转换。相反,transmute允许任意的转换,而这是 Rust 中最危险的功能之一!

强制转换(Coercion)

类型间的强制转换是隐式的并没有自己的语法,不过可以写作as。

强转出现在let,const和static语句;函数调用参数;结构体初始化的字符值;和函数返回值中。

最常用的强转的例子是从引用中去掉可变性:

&mut T到&T

一个相似的转换时去掉一个[裸指针](Raw Pointers 裸指针.md)的可变性:

*mut T到*const T

引用也能被强转为裸指针:

&T到*const T

&mut T到*mut T

自定义强转可以用[Deref](Deref coercions Deref强制多态.md)定义。

强转是可传递的。

as

as关键字进行安全的转换:

let x: i32 = 5;

let y = x as i64;

有三种形式的安全转换:显式转换,数字类型之间的转换,和指针转换。

转换并不是可传递的:即便是e as U1 as U2是一个有效的表达式,e as U2也不必要是(事实上只有在U1强转为U2时才有效)。

显式转换(Explicit coercions)

e as U是有效的仅当e是T类型而且T能强转为U。

数值转换

e as U的转换在如下情况下也是有效的:

e是T类型而且T和U是任意数值类型:numeric-cast

e是一个类 C 语言枚举(变量并没有附加值),而且U是一个整型:enum-cast

e是bool或char而且T是一个整型:prim-int-cast

e是u8而且U是char:u8-char-cast

例如:

let one = true as u8;

let at_sign = 64 as char;

let two_hundred = -56i8 as u8;

数值转换的语义是:

两个相同大小的整型之间(例如:i32->u32)的转换是一个no-op

从一个大的整型转换为一个小的整型(例如:u32->u8)会截断

从一个小的整型转换为一个大的整型(例如:u8->u32)会

如果源类型是无符号的会补零(zero-extend)

如果源类型是有符号的会符号(sign-extend)

从一个整型转换为一个浮点会产生整型的浮点表示,如有必要会舍入(未指定舍入策略)

从 f32 转换为 f64 是完美无缺的

指针转换

你也许会惊讶,[裸指针](Raw Pointers 裸指针.md)与整型之间的转换是安全的,而且不同类型的指针之间的转换遵循一些限制。只有解引用指针是不安全的:

let a = 300 as *const char; // a pointer to location 300

let b = a as u32;

e as U在如下情况是一个有效的指针转换:

e是*T类型,U是*U_0类型,且要么U_0: Sized要么unsize_kind(T) == unsize_kind(U_0):ptr-ptr-cast

e是*T类型且U是数值类型,同时T: Sized:ptr-addr-cast

e是一个整型且U是*U_0类型,同时U_0: Sized:addr-ptr-cast

e是&[T; n]类型且U是*const T类型:array-ptr-cast

e是函数指针且U是*T类型,同时T: Sized:fptr-ptr-cast

e是函数指针且U是一个整型:fptr-addr-cast

transmute

as只允许安全的转换,并会拒绝例如尝试将 4 个字节转换为一个u32:

let a = [0u8, 0u8, 0u8, 0u8];

let b = a as u32; // four eights makes 32

这个错误为:

error: non-scalar cast: `[u8; 4]` as `u32`

let b = a as u32; // four eights makes 32

^~~~~~~~

这是一个“非标量转换(non-scalar cast)”因为这里我们有多个值:四个元素的数组。这种类型的转换是非常危险的,因为他们假设多种底层结构的实现方式。为此,我们需要一些更危险的东西。

transmute函数由[编译器固有功能](Intrinsics 固有功能.md)提供,它做的工作非常简单,不过非常可怕。它告诉Rust对待一个类型的值就像它是另一个类型一样。它这样做并不管类型检查系统,并完全信任你。

在我们之前的例子中,我们知道一个有4个u8的数组可以正常代表一个u32,并且我们想要进行转换。使用transmute而不是as,Rust允许我们:

use std::mem;

unsafe {

let a = [0u8, 0u8, 0u8, 0u8];

let b = mem::transmute::(a);

}

为了使它编译通过我们要把这些操作封装到一个unsafe块中。技术上讲,只有mem::transmute调用自身需要位于块中,不过在这个情况下包含所有相关的内容是有好处的,这样你就知道该看哪了。在这例子中,a的细节也是重要的,所以它们放到了块中。你会看到各种风格的代码,有时上下文离得太远,因此在unsafe中包含所有的代码并不是一个好主意。

虽然transmute做了非常少的检查,至少它确保了这些类型是相同大小的,这个错误:

use std::mem;

unsafe {

let a = [0u8, 0u8, 0u8, 0u8];

let b = mem::transmute::(a);

}

和:

error: transmute called with differently sized types: [u8; 4] (32 bits) to u64

(64 bits)

除了这些,你可以自行随意转换,只能帮你这么多了!

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

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

相关文章

用原生JS读写CSS样式的方法总结

一、可以通过DOM节点对象的style对象(即CSSStyleDeclaration对象)来读写文档元素的CSS样式如:var elm document.getElementById(test);elm.style.color black;二、通过Element对象的getAttribute()、setAttribute()、removeAttribute()直接读写style属性如&#x…

html5开发ria_用于RIA的JavaFX 2与HTML5

html5开发ria这些天来,我们正在启动一个新项目,以实现Rich Internet Application(RIA) 。 第一个问题是:我们应该使用哪些技术和框架? 后端将是Java或其他现代JVM语言,因为我们是经验丰富的Java…

js里面拼接代码和使用ModelAndView

js里面拼接代码和使用ModelAndView1.js里面拼接代码 <tr><td class"tdTitle">性别</td><td class"tdCont"><select name"yhxb" id"yhxb" class"inputSel" style"width: 100px"><…

哔哩哔哩swot分析_哔哩哔哩2020校园招聘游戏运营笔试真题

在前不久《英雄联盟》S9世界大赛总决赛上&#xff0c;中国FPX战队以3&#xff1a;0横扫欧洲G2最终夺得S9世界冠军&#xff0c;国内玩家万分激动。总决赛刚结束不久&#xff0c;B站以8亿元价格拍得《英雄联盟》全球总决赛中国地区三年独家直播版权。作为主打年轻人群体起家的产品…

P2280 [HNOI2003]激光炸弹

P2280 [HNOI2003]激光炸弹 题目描述 输入输出格式 输入格式&#xff1a;输入文件名为input.txt 输入文件的第一行为正整数n和正整数R&#xff0c;接下来的n行每行有3个正整数&#xff0c;分别表示 xi&#xff0c;yi &#xff0c;vi 。 输出格式&#xff1a;输出文件名为output.…

在Spring Boot中使用配置元数据来配置您的配置

Spring Boot 1.3.0中发布了许多更新&#xff0c;但是其中一个对我很突出&#xff0c;因为我以前并不了解此更新&#xff0c;它的状态使其成为一项真正有用的功能&#xff08;不幸的是&#xff0c;撰写本文时仅在Spring Boot中可用&#xff09;这个&#xff09;。 我正在谈论配置…

jsp实现数据禁用和只读

jsp实现数据禁用和只读

java事务不生效场景_讲一下,我最近帮忙面试的几个“高级”JAVA,真的心累

最近看了很多简历&#xff0c;很多候选人年限不小&#xff0c;但是想着也不能通过简历就直接否定一个人&#xff0c;何况现在大环境越来 越难&#xff0c;大家找工作也不容易&#xff0c;于是就打算见一见。在沟通中发现&#xff0c;由于年限不小&#xff0c;他们的定位基本都是…

.net:Code First 创建或更新数据库

控制台输入命令&#xff1a; 切换到项目的project.json 文件所在文件 dotnet ef migrations add XXX dotnet ef database update Visual Studio程序包管理器控制台&#xff1a; Add-Migration XXX Update-Database转载于:https://www.cnblogs.com/Cchblogs/p/7155781.html

jQuery实现数据映入form表单

jQuery实现数据映入form表单//显示用户信息 function show(type, yhdm) {return $.ajax({url: getUrlPath() /userManage / type,type: "POST",data: {"type": type, "yhdm": yhdm},dataType: json,success: function (data) {$(#yhid).val(d…

gin 生成api文档_gin-swagger 生成RESTful风格OpenAPI文档

&#x1f4dc;什么是swaggerSwagger 是一个 API 生成工具&#xff0c;可以生成文档。 Swagger 是通过编写 yaml 和 json 来实现文档化。并且可以进行测试等工作。通过 swagger 可以方便的生成接口文档&#xff0c;方便前端进行查看和测试。&#x1f527;安装 swagger在我们的项…

antlr 教程_ANTLR教程– Hello Word

antlr 教程Antlr代表另一种语言识别工具。 该工具能够为任何计算机语言生成编译器或解释器。 除了明显的用途&#xff08;例如需要解析一种真正的“大型”编程语言&#xff0c;例如Java&#xff0c;PHP或SQL&#xff09;外&#xff0c;它还可以帮助执行更小&#xff0c;更常见的…

VBA操作word生成sql语句

项目开始一般都是用word保存下数据库的文档 但是从表单一个一个的建表实在是很困难乏味&#xff0c;查查资料 1、可以生成一个html或者xml&#xff0c;检索结构生成sql。但是这个方式也蛮麻烦 2、查到vba可以操作word读取表格。所以采用这种方式写了一个小程序。这样就可以直接…

jQuery实现禁用和只读

jQuery实现禁用和只读<td class"tdTitle"><i class"required">*</i>用户ID</td><td class"tdCont"><input class"inputText noNull param" id"yhid" notNull"用户ID" name"…

idea 单独引入jar_Intellij IDEA 添加jar包的三种方式

一.直接复制&#xff1a;(不推荐)方法&#xff1a;直接将硬盘上的jar包复制粘贴到项目的lib目录下即可。注意&#xff1a;1.对于导入的eclipse项目&#xff0c;该方式添加的jar包没有任何反应&#xff0c;用make编译项目会报错2.对于在idea中创建的项目&#xff0c;该方式添加j…

Java中使用ArrayList的10个示例–教程

Java中的ArrayList是HashMap之后最常用的集合类。 Java ArrayList表示一个可自动调整大小的数组&#xff0c;并用于代替数组。 由于创建数组后我们无法修改数组的大小&#xff0c;因此我们更喜欢在Java中使用ArrayList&#xff0c;一旦数组满了&#xff0c;它就会自动调整大小。…

[SoapUI] How to create a random UUID in each Request's Headers

${java.util.UUID.randomUUID()} is OK 转载于:https://www.cnblogs.com/MasterMonkInTemple/p/7159589.html

service层拼接XML

service层拼接XML1.xml文件样式 <?xml version"1.0" encoding"UTF-8"?> <rows><userdata name"totalnumber">21</userdata><row id"1"><cell>1</cell><cell>案号</cell><…

蓝桥杯评分标准_蓝桥杯比赛要求

七、奖项设置及评选办法7.1省赛1.参赛选手奖省赛每个组别设置一、二、三等奖&#xff0c;比例分别为10%、20%、30%&#xff0c;总比例为实际参赛人数的60%&#xff0c;零分卷不得奖。省赛一等奖选手获得直接进入全国总决赛资格。所有获奖选手均可获得由工业和信息化部人才交流中…

Node.js 国产 MVC 框架 ThinkJS 开发 config 篇

原创&#xff1a;荆秀网 网页即时推送 https://xxuyou.com | 转载请注明出处 链接&#xff1a;https://blog.xxuyou.com/nodejs-thinkjs-study-config/ 本系列教程以 ThinkJS v2.x 版本&#xff08;官网&#xff09;为例进行介绍&#xff0c;教程以实际操作为主。 按模块定义配…