rust的数据类型转换

一、数据类型系统

任何语言一定会存在两种类型,一种是原生的数据类型,比如常见的整形,双精度啥的;另外一种就是自定义的数据类型,这个就更好理解了,比如自定义的类和结构体等。对于有过C/C++编程经验的人都有过这种经验,比如把short转成int类型,或者把long 转成int类型。在后者的转换过程中,编译器会给一个警告,说会有裁剪导致数据丢失的问题。另外就是指针类型的转换使用reinterpret_cast,其它还有一些类似于static_cast、dynamic_cast等强制类型转换。
类型转换有显示的也有隐式的,举一个例子,一个函数参数是int类型,而调用传入了一个short,编译器就会作隐式的转换,显示的转换就是上面的类似const_cast等的转换。
在Rust中,为了安全起见,不允许隐式的(coercion)数据类型转换,而只能进行显示的(casting)数据类型转换。在Rust中可以通过as关键字来实现显示的数据类型转换。

二、类型转换的种类

在Rust中数据类型的转换主要有四种情况:
1、原生类型的数据类型转换(cast)

//忽略类型转换的溢出警告。
#![allow(overflowing_literals)]

fn main() {
    let dData = 35.22_f32;

    // 错误=>rust无隐式转换
    //let iData: u8 = dData;

    // 显式转换
    let iData= dData as u8;
}

这个比较简单,直接as就可以了,不过还得看应用的场景有没有什么需要考虑其它的情况。

2、给定字面量的数据类型

fn main() {
    // 通过后缀告诉编译器
    let a = 33u8;
    let b = 12u32;
    let c = 21f32;

    //无后缀,看具体的应用场景,如果没有场景则整数和浮点默认为i32,f64
    let x = 10;
    let f = 3.105;
}

其实,定义越明确以后代码越好维护。

3、数据类型推断(type inference)

fn main() {
    let d = 16u8;
    let mut vec = Vec::new();
    
    vec.push(d);
}

这种方式其实是减少了相关的编码而且基本影响不到代码的阅读。

4、数据类型的别名(alias)


type MyUi = u64;

// 屏蔽警告。
#[allow(non_camel_case_types)]
type u64_t = u64;

fn main() {
    let my: MyUi = 11 as u64_t;
}

这个其实就是给泛型等过长的数据类型进行简化的一种方式,省得写一大堆的代码,越懒越好啊。不过有一个地方需要说明,除了原生类型外,定义的别名需要按照驼峰命名方式。

数据类型的转换过程中,涉及到一些具体的数据处理的办法,这些细节可以看一下相关的Rust社区或者开发文档,涉及到的一些补码之类的基础知识,需要补充一下的需要看一看教材书本。

三、总结

数据类型的控制,是所有语言的基本要素,特别是对于静态编译类的语言,它的重要性是勿庸置疑。数据类型决定了数据在内存中占有的空间的大小和实际的数据的精度,在一些小菜鸟编程中经常遇到的典型的问题是有无符号的同样数据类型的转换,这个东西经常在一些嵌入式开发中引发稀奇古怪的问题。因此,每个程序员,对数据类型的控制,一定要发自内心的敬畏。一些写后台服务和大数据的开发人员,往往在一个字节或者两个字节的占用上斤斤计较,就是这个原因。
努力吧,归来的少年!
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值