无法解释的表达式结果

Unexplainable result of an expression

我目前正在做一个项目,由于“超出范围”、“内存访问冲突”和其他类似问题而陷入困境。花了很多时间试图找出问题的根源,我得到了这样一段微不足道的代码:

#include <iostream>

#define RANDOM(min, max) min + RAND_MAX / ((RAND_MAX - 1) / (max - min))

int main() {
    std::cout << RANDOM(0, 500) << std::endl;
}

一个编译器 clang500,这就是我所期望的。另一个(gcc 我猜,我使用 VS2017)说 504。后来我发现两者的 RAND_MAX 值不同,如果我为 clang 指定相同的值,它也会显示 504。这里RAND_MAX的值为32767.

我去我的 Python shell 手动计算表达式。所以我输入了

0 + 32767 / ((32767 - 1) / (500 - 0))

得到结果500.015259720442。这没办法504。怎么可能?

这种差异是由于这两种语言处理小数的方式不同造成的。

当您的代码中包含自然数时,C++ 编译器将默认使用 int 类型。但是,由于 int 类型不允许十进制数,因此每次在代码中进行除法得到十进制数时,它都会向下舍入到最接近的单位。

Python另一方面没有这个问题。

要指定您要在代码中使用双打,您可以这样做:

std::cout << 0 + 32767.0 / ((32767.0 - 1) / (500.0 - 0));

这是整数运算。 32766/64 是 65。32767/65 是 504。