Data types are a universal feature among many programming languages and provide a solid building block for the programs we build with it. Keep in mind that each language has its own types which may differ from other languages.
As programmers, knowing the various primitive types provided by a language is more than crucial. Hence, for this tutorial, we will walk through the various types in the Rust programming language.
Rust Primitive Types
There are two main categories for rust primitive types:
- Scalar Types
- Compound Types
However, it doesn’t really matter whether a type is scalar or compound, all you need to know is how to use it in your programs.
Let us start off with the most common and basic types in Rust:
Integers
The first category of primitive types in Rust is integers. An integer is a number type that does not have a fractional value. There are various types of integer types in Rust and include:
- i8
- u8
- i16
- u16
- i32
- u32
- i64
- u64
- i128
- u128
- isize
- usize
Each integer type takes the format of:
The letter in this case denotes whether the number can have a sign. If the type is signed (i), it can have a negative value. If unsigned (u), the number will only be positive.
The number value represents the size in bits the type will occupy in memory. For example, an i32 value represents a 32-bit signed integer.
The isize or usize type will depend on the architecture on which the code is running. If you are on 32-bit architecture, the type will take up 32-bits and 64-bit for 64bit architectures.
NOTE: Ensure you keep your values within the range of your specified types. Otherwise, you have an overflow which may lead to dangerous operations.
The example program below shows how to declare and use integer types in Rust.
// integer types
let i_8 = -128;
let u_8 = 127;
let i_16 = -32768;
let u_16 = 32767;
let i_32 = -2147483648;
let u_32 = 2147483647;
let i_64 = -9223372036854775808_i64;
let u_64 = 9223372036854775807_u64;
let i_128 = -170141183460469231731687303715884105728_i128;
let u_128 = 170141183460469231731687303715884105727_u128;
let i_size = -9223372036854775808_isize;
let u_size = 9223372036854775807_usize;
println!("i_8 -> {}\nu_8 -> {}\ni_16 -> {}\nu_16 -> {}\ni_32 -> {}\nu_32 -> {}\ni_64 -> {}\ni_64 -> {}\ni_128 -> {}\nu_128 -> {}\ni_size -> {}\nu_size -> {}", i_8, u_8, i_16,u_16, i_32, u_32, i_64, u_64, i_128, u_128, i_size, u_size );
}
The program above shows how to declare int types in Rust. This should print:
NOTE: If you do not specify the type when assigning a numeric value, Rust will default into an i32 type.
Floating-Type
Rust has floating-type numbers. These are numbers that include floating point values or decimal points. There are only two types of floating types in Rust: f32 and f64 that are 32-bit and 64-bit values.
Example of floating type are as shown:
let f_64 = 3.141; // 64-bit floating type
If you do not specify the type for a floating-point value, Rust will default to f64 type.
Booleans
The other type provided by Rust is a Boolean. Like all Boolean logic values, it has two possible values: true or false. A Boolean is one byte in size.
Example is as shown:
let var2 = false;
Character Type
The character type refers to a single Unicode character. It is 4 bytes in size. For example, the following shows various types of Unicode char types.
let emoji = '😊';
let pi = 'π';
let great = '大';
The code examples above represent various Unicode characters.
Arrays
The second category of primitive types in Rust is compound types. An array is part of compound type.
An array refers to an ordered collection of values of similar types. The code below shows an array in Rust:
In Rust, we declare an array using the let keyword followed by the variable name, a full-colon and the type and size inside a square bracket.
Slices
Slices are closely similar to arrays except they are dynamic. Unlike an array, a slice can grow or shrink in size.
An example is as shown:
Tuples
The other type of compounds data types in Rust is a tuple. A tuple is defined a heterogenous sequence of values. A tuple can hold values of multiple types unlike an array. Tuples also have an order and can be accessed via their indexes. Check our tutorial on Rust tuples to learn more.
An example of a Rust tuple is as shown below:
let tup_letter: (i32, &str, f64, char) = (100, "hello", 3.141, 'A'); // explicit type annotation
In the first tuple, we let the Rust compiler to infer the type based on the values provided.
For the second one, we explicitly tell the compiler which types we want. Keep in mind that the order matters in this type of declaration.
Conclusion
From this tutorial, you notice Rust provides us with a suite of awesome primitive types. They allow us to handle various data types and control the data that comes in or out of our applications.
Thanks for reading!