integer in Rust

Type | Storage size | Value range
--- | --- | --- 
u8 | 1 byte | 0 to 2<sup>8</sup>-1
i8 | 1 byte | -2<sup>7</sup> to 2<sup>7</sup>-1
u16 | 2 byte | 0 to 2<sup>16</sup>-1
i16 | 2 byte | -2<sup>15</sup> to 2<sup>15</sup>-1
u32 | 4 byte | 0 to 2<sup>32</sup>-1
i32 | 4 byte | -2<sup>31</sup> to 2<sup>31</sup>-1
u64 | 8 byte | 0 to 2<sup>64</sup>-1
i64 | 8 byte | -2<sup>63</sup> to 2<sup>63</sup>-1
u128 | 16 byte | 0 to 2<sup>128</sup>-1
i128 | 16 byte | -2<sup>127</sup> to 2<sup>127</sup>-1
usize | Arch | 0 to 2<sup>32</sup>-1 or 0 to 2<sup>64</sup>-1
isize | Arch | -2<sup>31</sup> to 2<sup>31</sup>-1 or -2<sup>63</sup> to 2<sup>63</sup>-1

The size of an integer can be arch. This means the size of the data type will be derived from the architecture of the machine. An integer the size of which is arch will be 32 bits on an x86 machine and 64 bits on an x64 machine. An arch integer is primarily used when indexing some sort of collection.
```
fn main() {
    let v = -1; println!("{}", v);
    let vu8:u8 = 1; println!("{}", vu8);
    let vi8:i8 = -1; println!("{}", vi8);
    let vu16:u16 = 1; println!("{}", vu16);
    let vi16:i16 = -1; println!("{}", vi16);
    let vu32:u32 = 1; println!("{}", vu32);
    let vi32:i32 = -1; println!("{}", vi32);
    let vu64:u64 = 1; println!("{}", vu64);
    let vi64:i64 = -1; println!("{}", vi64);
    let vu128:u128 = 1; println!("{}", vu128);
    let vi128:i128 = -1; println!("{}", vi128);
    let vusize:usize = 1; println!("{}", vusize);
    let visize:isize = -1; println!("{}", visize);
}
```
Output:
```
-1
1
-1
1
-1
1
-1
1
-1
1
-1
1
-1
```