
Data Structure
Networking
RDBMS
Operating System
Java
MS Excel
iOS
HTML
CSS
Android
Python
C Programming
C++
C#
MongoDB
MySQL
Javascript
PHP
- Selected Reading
- UPSC IAS Exams Notes
- Developer's Best Practices
- Questions and Answers
- Effective Resume Writing
- HR Interview Questions
- Computer Glossary
- Who is Who
Casting in Rust Programming
Casting or explicit conversion is only allowed in Rust, there’s no implicit conversion that the compiler of Rust does for us. It is known that, in many cases, implicit conversion can lead to data losses, which is not a good thing.
Rules for converting between different types is pretty similar to C. In Rust though, we make use of as keyword when we want to convert from one type to another.
Example:
Consider the following example:
// Suppress all warnings from casts which overflow. #![allow(overflowing_literals)] fn main() { let decimal = 65.43_f32; // Error! No implicit conversion // let integer: u8 = decimal; // FIXME ^ Comment out this line // Explicit conversion let integer = decimal as u8; let character = integer as char; println!("Casting: {} -> {} -> {}", decimal, integer, character); }
In the above code example, we are trying to convert a float32 value into an integer and then that integer into a char, and then finally printing them out to the terminal.
Output
Casting: 65.43 -> 65 -> A
If we remove the comment on the implicit conversion, then the compiler will throw an error.
Example
Consider the updated code shown below:
// Suppress all warnings from casts which overflow. #![allow(overflowing_literals)] fn main() { let decimal = 65.43_f32; // Error! No implicit conversion let integer: u8 = decimal; // FIXME ^ Comment out this line // Explicit conversion let integer = decimal as u8; let character = integer as char; println!("Casting: {} -> {} -> {}", decimal, integer, character); }
Output
error[E0308]: mismatched types --> src/main.rs:8:23 | 8| let integer: u8 = decimal; | -- ^^^^^^^ expected `u8`, found `f32` | | | expected due to this
Since Rust 1.45, the ‘as’ keyword also performs a saturation cast, when we are converting a float into an int.
Example
Consider the code shown below as an example:
// Suppress all warnings from casts which overflow. #![allow(overflowing_literals)] fn main() { // 300.0 is 255 println!("301.0 is {}", 301.0_f32 as u8); // -100.0 as u8 is 0 println!("-101.0 as u8 is {}", -101.0_f32 as u8); // nan as u8 is 0 println!("nan as u8 is {}", f32::NAN as u8); }
Output
301.0 is 255 -101.0 as u8 is 0 nan as u8 is 0