不能应用一元运算符`-`来键入`usize`

时间:2017-06-07 23:56:47

标签: rust

我试图让一些较旧的Rust代码进行编译,以及这段代码:

const SOMETHING: *const c_char = -1 as *const c_char;

我收到此错误:

error: cannot apply unary operator `-` to type `usize`
  --> src/lib.rs:32:34
   |
32 | const SOMETHING: *const c_char = -1 as *const c_char;
   |         

我怀疑这是因为c_char未签名且未签名不能为负,但我不知道如何修复它。此代码适用于一些未知的旧版Rust。我尝试将c_char改为i8只是为了好玩而且没有用。

2 个答案:

答案 0 :(得分:9)

指针对象的类型无关紧要。当你将一个整数强制转换为指针时,Rust会推断整数必须是usize,因为它是唯一的类型(除isize之外,虽然它不经常使用)但保证具有相同的类型大小作为指针。

实际上,在Rust中,一元否定运算符不再适用于无符号整数类型。相反,您应该使用按位非运算符(在{C}中写为!,而不是~。)

在二进制补码二进制中,这两个运算符之间有一个直接的等价:!x == -(x + 1)。具体而言,-1的等效值为!0。因此,你可以写:

const SOMETHING: *const c_char = !0 as *const c_char;

答案 1 :(得分:6)

如果你真的想设置一个指向$的指针,你可以,你只需要明确表示积分值是-1,而不是isize

usize

您还可以说它是const SOMETHING: *const c_char = -1_isize as *const c_char; 的最大值:

usize

这两个结果都相同:

const SOMETHING: *const c_char = std::usize::MAX as *const c_char;

打印:

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);
}