gpt4 book ai didi

casting - Rust:如何从有符号整数类型转换为较大的带符号整数类型(不带*符号扩展名)

转载 作者:行者123 更新时间:2023-12-03 11:33:14 25 4
gpt4 key购买 nike

假设我们有一个i8,我们希望将其转换为不带符号扩展名的i16

我们无法为我们做一个简单的as强制转换,因为这将标志扩展。

println!("{:b}", -128i8); // 10000000 <- we want this zero-extended in an i16.
println!("{:b}", -128i8 as i16); // 1111111110000000 sign extended :(

我们无法转换,因为类型的大小不同:
println!("{:b}", unsafe {mem::transmute::<_, i16>(128i8)});
// ^ error[E0512]: cannot transmute between types of different sizes, or dependently-sized types :(

我想出的最好的方法是以下复杂的类型转换链:
println!("{:b}", -128i8 as u8 as u16 as i16); // 10000000 :), but :( because convoluted.

中间转换为 u8意味着转换为 u16会零扩展而不是符号扩展,然后从 u16转换为 i16很好,因为类型的大小相同并且不需要扩展。

但是必须有更好的方法吗?在那儿?

最佳答案

请记住,在这种情况下(打印数字的位),您可以进行无符号转换。

但是总的来说,Rust并不真正喜欢隐式转换,但是您始终可以编写

let n : i8 = -128;
let m : i32 = n as u8 as i32;

通常,您几乎无法获得比这更好的效果,因为在更改指针类型之类的字段中,双重转换很常见。当您可以安全地完成操作而没有负面影响时(除了可能有轻微的代码异味),请考虑不要使用不安全的方法。

关于casting - Rust:如何从有符号整数类型转换为较大的带符号整数类型(不带*符号扩展名),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62067879/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com