rust 将u128复制到[u64;2]

eaf3rand  于 2023-03-30  发布在  其他
关注(0)|答案(2)|浏览(156)

如何将u128转换为u64 s的数组。当将u128传递给接受任意精度int的API时,API接受3个参数

LLVMValueRef LLVMConstIntOfArbitraryPrecision   (
  LLVMTypeRef IntTy,
  unsigned  NumWords,
  const uint64_t Words[] 
)

前两个参数是已知的(IntTy = LLVMInt128TypeNumWords = 2)。第三个参数需要一个uint64_t s的数组。提供的u128需要转换为u64的数组。从rust文档看,u128可以转换为字节数组,例如:

let buff: [u8; 16] = u128_val.to_ne_bytes();
let Words: [u64; 2] = ?? // What to do here?

如何将buff转换为Words数组?如何处理字节序。为了简单起见,代码生成器和API将在具有相同字节序的机器上运行。

odopli94

odopli941#

我只是用手做的,这避免了任何不安全的,是直接向前的,关心endianness:

pub fn foo(a: u128) -> [u64; 2] {
    [(a >> 64) as u64, a as u64]
}

这将转换为:

playground::foo:
    movq    %rdi, %rax
    movq    %rdx, (%rdi)
    movq    %rsi, 8(%rdi)
    retq
7nbnzgx9

7nbnzgx92#

标准库中没有内置任何东西(但请参阅Project Safe Transmute)。使用bytemuck

let words: [u64; 2] = bytemuck::cast(u128_val);

不安全:

let words: [u64; 2] = unsafe { std::mem::transmute::<u128, [u64; 2]>(v) };

相关问题