AtomicU64 是否总是像生锈的大端一样进行操作?

Does AtomicU64 always undergo operations as big endian in rust?

所以我正在做一些涉及无等待或无锁引用计数的实验,我试图将一个小位标志集的存储和一个原子计数器结合起来。我想出了以下代码:

use std::sync::atomic::{AtomicU64, Ordering};

fn main() {
   let num = AtomicU64::new((3 as u64) << 62);
   println!("{:#b}", num.load(Ordering::SeqCst));
   num.fetch_add(1, Ordering::SeqCst);
   println!("{:#b}", num.load(Ordering::SeqCst));
   assert_eq!((num.load(Ordering::SeqCst) & !((3 as u64) << 62)), 1 as u64);
}

打印

0b1100000000000000000000000000000000000000000000000000000000000000
0b1100000000000000000000000000000000000000000000000000000000000001

并且不会失败 assert_eq。但是,我想知道这段代码是否可以跨平台工作? AtomicU64 是否总是以大端方式进行操作?或者它有时会像 little endian 一样进行操作吗?如果是这样,我应该如何更改我的代码以在 AtomicU64 可以运行的任何平台上运行?

作为参考,这个结果是从 rust playground 获得的。

Does AtomicU64 always undergo operations as big endian in rust?

取决于平台。

I am wondering if this code will work cross platform?

是的。

Does AtomicU64 always undergo operations as big endian ?

没有

Or does it sometime under go operations as little endian ?

是的。好吧,“有时”- endianess 固定在一个平台上。

how should I change my code to work on any platform that AtomicU64 works on ?

无需进行任何更改。

运算符<<&!表示数学运算,与它们如何实现或存储无关,结果为数学上到处都一样。 3 << 62 在任何地方都等于 3 * 2**64 = 13835058055282163712,无论数字如何表示。