我正在尝试编译一些较旧的Rust代码,并在这段代码上:
const SOMETHING: *const c_char = -1 as *const c_char;
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
error: cannot apply unary operator `-` to type `usize`
--> src/lib.rs:32:34
|
32 | const SOMETHING: *const c_char = -1 as *const c_char;
|
Run Code Online (Sandbox Code Playgroud)
我怀疑这是因为c_char无符号和无符号不能为负,但我不知道如何解决它.此代码适用于一些未知的旧版Rust.我尝试c_char改为i8只是为了好玩,但是没有用.
指针的类型无关紧要.当你将一个整数强制转换为指针时,Rust会推断整数必须是a usize,因为它是唯一的类型(此外isize,虽然它不经常使用)但保证与指针具有相同的大小.
实际上,在Rust中,一元否定运算符不再适用于无符号整数类型.相反,您应该使用按位非运算符(写入!,而不是~在C中).
在二进制补码二进制中,这两个运算符之间存在直接的等价关系:!x == -(x + 1).具体而言,等效的-1是!0.因此,你可以写:
const SOMETHING: *const c_char = !0 as *const c_char;
Run Code Online (Sandbox Code Playgroud)
如果你真的想设置指针-1,你可以,你只需要明确表示积分值是a isize,而不是usize:
const SOMETHING: *const c_char = -1_isize as *const c_char;
Run Code Online (Sandbox Code Playgroud)
你也可以说它是最大值usize:
const SOMETHING: *const c_char = std::usize::MAX as *const c_char;
Run Code Online (Sandbox Code Playgroud)
这两个都有相同的结果:
extern crate libc;
use libc::c_char;
const SOMETHING1: *const c_char = -1_isize as *const c_char;
const SOMETHING2: *const c_char = std::usize::MAX as *const c_char;
fn main() {
println!("{:p}", SOMETHING1);
println!("{:p}", SOMETHING2);
}
Run Code Online (Sandbox Code Playgroud)
打印:
0xffffffffffffffff
0xffffffffffffffff
Run Code Online (Sandbox Code Playgroud)