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
,无论数字如何表示。
所以我正在做一些涉及无等待或无锁引用计数的实验,我试图将一个小位标志集的存储和一个原子计数器结合起来。我想出了以下代码:
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
,无论数字如何表示。