@@ -358,31 +358,106 @@ same trait object.
358
358
359
359
* Numeric cast
360
360
* Casting between two integers of the same size (e.g. i32 -> u32) is a no-op
361
+ ```rust
362
+ # #![ allow(overflowing_literals)]
363
+ assert_eq!(42i8 as u8, 42u8);
364
+ assert_eq!(-1i8 as u8, 255u8);
365
+ assert_eq!(255u8 as i8, -1i8);
366
+ assert_eq!(0xffu8 as i8, 0xffi8);
367
+ assert_eq!(-1i16 as u16, 65535u16);
368
+ ```
369
+
361
370
* Casting from a larger integer to a smaller integer (e.g. u32 -> u8) will
362
371
truncate
372
+ ``` rust
373
+ # #![allow(overflowing_literals)]
374
+ assert_eq! (42u16 as u8 , 42u8 );
375
+ assert_eq! (1234u16 as u8 , 210u8 );
376
+ assert_eq! (0xabcdu16 as u8 , 0xcdu8 );
377
+
378
+ assert_eq! (- 42i16 as i8 , - 42i8 );
379
+ assert_eq! (1234u16 as i8 , - 46i8 );
380
+ assert_eq! (0xabcdi16 as i8 , 0xcdi8 );
381
+ ```
382
+
363
383
* Casting from a smaller integer to a larger integer (e . g. u8 -> u32 ) will
364
384
* zero - extend if the source is unsigned
365
385
* sign - extend if the source is signed
386
+ ```rust
387
+ # #![allow(overflowing_literals)]
388
+ assert_eq! (42i8 as i16 , 42i16 );
389
+ assert_eq! (- 17i8 as i16 , - 17i16 );
390
+ assert_eq! (0b1000_1010u8 as u16 , 0b0000_0000_1000_1010u16 , " Zero-extend" );
391
+ assert_eq! (0b0000_1010i8 as i16 , 0b0000_0000_0000_1010i16 , " Sign-extend 0" );
392
+ assert_eq! (0b1000_1010i8 as i16 , 0b1111_1111_1000_1010i16 , " Sign-extend 1" );
393
+ ```
394
+
366
395
* Casting from a float to an integer will round the float towards zero
367
396
* ** [NOTE : currently this will cause Undefined Behavior if the rounded
368
397
value cannot be represented by the target integer type ][float - int ]** .
369
398
This includes Inf and NaN . This is a bug and will be fixed .
399
+ ```rust
400
+ assert_eq! (42.9f32 as i32 , 42 );
401
+ assert_eq! (- 42.9f32 as i32 , - 42 );
402
+ assert_eq! (42_000_000f32 as i32 , 42_000_000 );
403
+ println! (" Undefined Behavior: {}" , 1_000_000_000_000_000f32 as i32 );
404
+ println! (" Undefined Behavior: {}" , std :: f32 :: NEG_INFINITY as i32 );
405
+ println! (" Undefined Behavior: {}" , std :: f32 :: NAN as i32 );
406
+ ```
407
+
370
408
* Casting from an integer to float will produce the closest possible float \*
371
409
* if necessary , rounding is according to `roundTiesToEven` mode \* \* \*
372
410
* on overflow , infinity (of the same sign as the input ) is produced
373
411
* note : with the current set of numeric types , overflow can only happen
374
412
on `u128 as f32 ` for values greater or equal to `f32 :: MAX + (0.5 ULP )`
413
+ ```rust
414
+ assert_eq! (1337i32 as f32 , 1337f32 );
415
+ assert_eq! (123_456_789i32 as f32 , 123_456_790f32 , " Rounded" );
416
+ assert_eq! (0xffffffff_ffffffff_ffffffff_ffffffff_u128 as f32 , std :: f32 :: INFINITY );
417
+ ```
418
+
375
419
* Casting from an f32 to an f64 is perfect and lossless
420
+ ```rust
421
+ assert_eq! (1_234.5f32 as f64 , 1_234.5f64 );
422
+ assert_eq! (std :: f32 :: INFINITY as f64 , std :: f64 :: INFINITY );
423
+ assert! ((std :: f32 :: NAN as f64 ). is_nan ());
424
+ ```
425
+
376
426
* Casting from an f64 to an f32 will produce the closest possible f32 \* \*
377
427
* if necessary , rounding is according to `roundTiesToEven` mode \* \* \*
378
428
* on overflow , infinity (of the same sign as the input ) is produced
429
+ ```rust
430
+ assert_eq! (1_234.5f64 as f32 , 1_234.5f32 );
431
+ assert_eq! (1_234_567_891.123f64 as f32 , 1_234_567_890f32 , " Rounded" );
432
+ assert_eq! (std :: f64 :: INFINITY as f32 , std :: f32 :: INFINITY );
433
+ assert! ((std :: f64 :: NAN as f32 ). is_nan ());
434
+ ```
435
+
379
436
* Enum cast
380
437
* Casts an enum to its discriminant , then uses a numeric cast if needed .
438
+ ```rust
439
+ enum Enum { A , B , C }
440
+ assert_eq! (Enum :: A as i32 , 0 );
441
+ assert_eq! (Enum :: B as i32 , 1 );
442
+ assert_eq! (Enum :: C as i32 , 2 );
443
+ ```
444
+
381
445
* Primitive to integer cast
382
446
* `false ` casts to `0 `, `true ` casts to `1 `
383
447
* `char ` casts to the value of the code point , then uses a numeric cast if needed .
448
+ ```rust
449
+ assert_eq! (false as i32 , 0 );
450
+ assert_eq! (true as i32 , 1 );
451
+ assert_eq! ('A' as i32 , 65 );
452
+ assert_eq! ('Ö' as i32 , 214 );
453
+ ```
454
+
384
455
* `u8 ` to `char ` cast
385
456
* Casts to the `char ` with the corresponding code point .
457
+ ```rust
458
+ assert_eq! (65u8 as char , 'A' );
459
+ assert_eq! (214u8 as char , 'Ö' );
460
+ ```
386
461
387
462
\* if integer - to - float casts with this rounding mode and overflow behavior are
388
463
not supported natively by the hardware , these casts will likely be slower than
0 commit comments