@@ -398,25 +398,84 @@ reference types and `mut` or `const` in pointer types.
398
398
399
399
* Casting between two integers of the same size (e.g. i32 -> u32) is a no-op
400
400
(Rust uses 2's complement for negative values of fixed integers)
401
+
402
+ ``` rust
403
+ assert_eq! (42i8 as u8 , 42u8 );
404
+ assert_eq! (- 1i8 as u8 , 255u8 );
405
+ assert_eq! (255u8 as i8 , - 1i8 );
406
+ assert_eq! (- 1i16 as u16 , 65535u16 );
407
+ ```
408
+
401
409
* Casting from a larger integer to a smaller integer (e.g. u32 -> u8) will
402
410
truncate
411
+
412
+ ``` rust
413
+ assert_eq! (42u16 as u8 , 42u8 );
414
+ assert_eq! (1234u16 as u8 , 210u8 );
415
+ assert_eq! (0xabcdu16 as u8 , 0xcdu8 );
416
+
417
+ assert_eq! (- 42i16 as i8 , - 42i8 );
418
+ assert_eq! (1234u16 as i8 , - 46i8 );
419
+ assert_eq! (0xabcdi32 as i8 , - 51i8 );
420
+ ```
421
+
403
422
* Casting from a smaller integer to a larger integer (e.g. u8 -> u32) will
404
423
* zero-extend if the source is unsigned
405
424
* sign-extend if the source is signed
425
+
426
+ ``` rust
427
+ assert_eq! (42i8 as i16 , 42i16 );
428
+ assert_eq! (- 17i8 as i16 , - 17i16 );
429
+ assert_eq! (0b1000_1010u8 as u16 , 0b0000_0000_1000_1010u16 , " Zero-extend" );
430
+ assert_eq! (0b0000_1010i8 as i16 , 0b0000_0000_0000_1010i16 , " Sign-extend 0" );
431
+ assert_eq! (0b1000_1010u8 as i8 as i16 , 0b1111_1111_1000_1010u16 as i16 , " Sign-extend 1" );
432
+ ```
433
+
406
434
* Casting from a float to an integer will round the float towards zero
407
435
* ` NaN ` will return ` 0 `
408
436
* Values larger than the maximum integer value, including ` INFINITY ` , will saturate to the maximum value of the integer type.
409
437
* Values smaller than the minimum integer value, including ` NEG_INFINITY ` , will saturate to the minimum value of the integer type.
438
+
439
+ ``` rust
440
+ assert_eq! (42.9f32 as i32 , 42 );
441
+ assert_eq! (- 42.9f32 as i32 , - 42 );
442
+ assert_eq! (42_000_000f32 as i32 , 42_000_000 );
443
+ assert_eq! (std :: f32 :: NAN as i32 , 0 );
444
+ assert_eq! (1_000_000_000_000_000f32 as i32 , 0x7fffffffi32 );
445
+ assert_eq! (std :: f32 :: NEG_INFINITY as i32 , - 0x80000000i32 );
446
+ ```
447
+
410
448
* Casting from an integer to float will produce the closest possible float \*
411
449
* if necessary, rounding is according to ` roundTiesToEven ` mode \*\*\*
412
450
* on overflow, infinity (of the same sign as the input) is produced
413
451
* note: with the current set of numeric types, overflow can only happen
414
452
on ` u128 as f32 ` for values greater or equal to ` f32::MAX + (0.5 ULP) `
453
+
454
+ ``` rust
455
+ assert_eq! (1337i32 as f32 , 1337f32 );
456
+ assert_eq! (123_456_789i32 as f32 , 123_456_790f32 , " Rounded" );
457
+ assert_eq! (0xffffffff_ffffffff_ffffffff_ffffffff_u128 as f32 , std :: f32 :: INFINITY );
458
+ ```
459
+
415
460
* Casting from an f32 to an f64 is perfect and lossless
461
+
462
+ ``` rust
463
+ assert_eq! (1_234.5f32 as f64 , 1_234.5f64 );
464
+ assert_eq! (std :: f32 :: INFINITY as f64 , std :: f64 :: INFINITY );
465
+ assert! ((std :: f32 :: NAN as f64 ). is_nan ());
466
+ ```
467
+
416
468
* Casting from an f64 to an f32 will produce the closest possible f32 \*\*
417
469
* if necessary, rounding is according to ` roundTiesToEven ` mode \*\*\*
418
470
* on overflow, infinity (of the same sign as the input) is produced
419
471
472
+ ``` rust
473
+ assert_eq! (1_234.5f64 as f32 , 1_234.5f32 );
474
+ assert_eq! (1_234_567_891.123f64 as f32 , 1_234_567_890f32 , " Rounded" );
475
+ assert_eq! (std :: f64 :: INFINITY as f32 , std :: f32 :: INFINITY );
476
+ assert! ((std :: f64 :: NAN as f32 ). is_nan ());
477
+ ```
478
+
420
479
\* if integer-to-float casts with this rounding mode and overflow behavior are
421
480
not supported natively by the hardware, these casts will likely be slower than
422
481
expected.
@@ -437,15 +496,34 @@ Casting is limited to the following kinds of enumerations:
437
496
* [ Unit-only enums]
438
497
* [ Field-less enums] without [ explicit discriminants] , or where only unit-variants have explicit discriminants
439
498
499
+ ``` rust
500
+ enum Enum { A , B , C }
501
+ assert_eq! (Enum :: A as i32 , 0 );
502
+ assert_eq! (Enum :: B as i32 , 1 );
503
+ assert_eq! (Enum :: C as i32 , 2 );
504
+ ```
505
+
440
506
#### Primitive to integer cast
441
507
442
508
* ` false ` casts to ` 0 ` , ` true ` casts to ` 1 `
443
509
* ` char ` casts to the value of the code point, then uses a numeric cast if needed.
444
510
511
+ ``` rust
512
+ assert_eq! (false as i32 , 0 );
513
+ assert_eq! (true as i32 , 1 );
514
+ assert_eq! ('A' as i32 , 65 );
515
+ assert_eq! ('Ö' as i32 , 214 );
516
+ ```
517
+
445
518
#### ` u8 ` to ` char ` cast
446
519
447
520
Casts to the ` char ` with the corresponding code point.
448
521
522
+ ``` rust
523
+ assert_eq! (65u8 as char , 'A' );
524
+ assert_eq! (214u8 as char , 'Ö' );
525
+ ```
526
+
449
527
#### Pointer to address cast
450
528
451
529
Casting from a raw pointer to an integer produces the machine address of the referenced memory.
0 commit comments