Compiler errors 如何保证常量变量中不会发生溢出?

Compiler errors 如何保证常量变量中不会发生溢出?,compiler-errors,rust,constants,integer-overflow,unsigned-integer,Compiler Errors,Rust,Constants,Integer Overflow,Unsigned Integer,我可以描述这个圆形六边形网格的尺寸 。。编译时仅定义了1个值n: const GRID_RADIUS: usize = 3; 因此,网格中的单元数在编译时也是已知的,因为这里是2n+1^2-n*n+1 37 但是,以下方面: 常数N:usize=3; 常量N_单元格:usize=2*N+1^2-N*N+1; 结构细胞; 结构网格{ 单元格:[单元格;N_单元格], } 不编译: 错误:使用此值将导致错误 ->src/main.rs:2:34 | 2 |常数N_单元格:usize=2*N+1^2

我可以描述这个圆形六边形网格的尺寸

。。编译时仅定义了1个值n:

const GRID_RADIUS: usize = 3;
因此,网格中的单元数在编译时也是已知的,因为这里是2n+1^2-n*n+1 37

但是,以下方面:

常数N:usize=3; 常量N_单元格:usize=2*N+1^2-N*N+1; 结构细胞; 结构网格{ 单元格:[单元格;N_单元格], } 不编译:

错误:使用此值将导致错误 ->src/main.rs:2:34 | 2 |常数N_单元格:usize=2*N+1^2-N*N+1; | ------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^- | | |尝试使用溢出进行减法 | =注意:`[denyconst_err]`默认情况下处于打开状态 我知道rustc担心减去usize类型可能会导致溢出,但我可以保证N_单元格在这种情况下始终为正


我如何才能对此负责并让rustc相信我?

无法保证-常量值是在编译时计算的。编译器知道值是否因为执行了计算而溢出

我知道rustc担心减去usize类型可能会导致溢出,但我可以保证N_单元格在这种情况下始终为正

我怎样才能对此负责并让rustc相信我

您不能保证这一点,编译器不应该信任您,因为您不正确。^表示异或,而不是异或。编译器执行您的代码并将其减去零以下,从而触发错误。这不是假设:

2*n^2=4 n*n+1=12 4 - 12 = -8 线程“main”在“尝试使用溢出进行减法”时惊慌失措,src/main.rs:3:26 事实上,Rust现在显示了导致溢出的值,希望能让原来的错误更清楚:

->src/lib.rs:2:24 | 2 |常数N_单元格:usize=2*N+1^2-N*N+1; | ------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^- | | |试图计算'5_usize-12_usize',这将溢出 | =注意:`[denyconst_err]`默认情况下处于打开状态 另见:

不幸的是,您当前无法在常量中使用pow:

const N: usize = 3;
const N_CELLS: usize = ((2 * N + 1).pow(2)) - N * (N + 1);
错误[E0015]:常量中的调用仅限于常量函数、元组结构和元组变量 ->src/lib.rs:2:24 | 2 |常数N_单元:usize=2*N+1.pow2-N*N+1; | ^^^^^^^^^^^^^^^^^^^^ 您必须自己展开乘法运算:

const N_CELLS: usize = {
    let a = 2 * N + 1;
    let b = N * (N + 1);
    a * a - b
};

没有保证会这样做-常量值是在编译时计算的。编译器知道值是否因为执行了计算而溢出

我知道rustc担心减去usize类型可能会导致溢出,但我可以保证N_单元格在这种情况下始终为正

我怎样才能对此负责并让rustc相信我

您不能保证这一点,编译器不应该信任您,因为您不正确。^表示异或,而不是异或。编译器执行您的代码并将其减去零以下,从而触发错误。这不是假设:

2*n^2=4 n*n+1=12 4 - 12 = -8 线程“main”在“尝试使用溢出进行减法”时惊慌失措,src/main.rs:3:26 事实上,Rust现在显示了导致溢出的值,希望能让原来的错误更清楚:

->src/lib.rs:2:24 | 2 |常数N_单元格:usize=2*N+1^2-N*N+1; | ------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^- | | |试图计算'5_usize-12_usize',这将溢出 | =注意:`[denyconst_err]`默认情况下处于打开状态 另见:

不幸的是,您当前无法在常量中使用pow:

const N: usize = 3;
const N_CELLS: usize = ((2 * N + 1).pow(2)) - N * (N + 1);
错误[E0015]:常量中的调用仅限于常量函数、元组结构和元组变量 ->src/lib.rs:2:24 | 2 |常数N_单元:usize=2*N+1.pow2-N*N+1; | ^^^^^^^^^^^^^^^^^^^^ 您必须自己展开乘法运算:

const N_CELLS: usize = {
    let a = 2 * N + 1;
    let b = N * (N + 1);
    a * a - b
};

哇。是的,我错了。对不起。我读到core::num:::pow作为const fn还不稳定,但是它可以用2*N+1*2*N+1代替。Wops。是的,我错了。对不起。我读到core::num:::pow作为const fn还不稳定,但是它可以用2*N+1*2*N+1来代替。