我在使用C++时遇到了一个奇怪的问题,即long数据类型在应该之前就溢出了。 目前我正在尝试让整数像浮点数一样工作,这样范围[-32767, 32767]就映射到[-1.0, 1.0]。 然而问题是当参数更大,表示大于1.0的浮点数时它会失败:
inline long times(long a, long b) {
printf("a=%ld b=%ld ",a,b);
a *= b;
printf("a*b=%ld ",a);
a /= 32767l;
printf("a*b/32767=%ld\n",a);
return a;
}
int main(void) {
printf("%ld\n",times(98301l,32767l));
}
我得到的输出是:
a=98301 b=32767 a*b=-1073938429 a*b/32767=-32775
-32775
所以times(98301,32767)类似于3.0 * 1.0。当times的参数小于32767(1.0)时,此代码完美运行,但是参数大于此值时中间步骤不应溢出long的64位。
有什么想法吗?