无法解释的表达式结果
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;
}
一个编译器 clang
说 500
,这就是我所期望的。另一个(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。
我目前正在做一个项目,由于“超出范围”、“内存访问冲突”和其他类似问题而陷入困境。花了很多时间试图找出问题的根源,我得到了这样一段微不足道的代码:
#include <iostream>
#define RANDOM(min, max) min + RAND_MAX / ((RAND_MAX - 1) / (max - min))
int main() {
std::cout << RANDOM(0, 500) << std::endl;
}
一个编译器 clang
说 500
,这就是我所期望的。另一个(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。