C++长整型溢出问题

7

我在使用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位。

有什么想法吗?


你能接受答案吗?这会让人们更愿意在未来帮助你。 - Gregor Brandt
4个回答

9

long不一定是64位。可以尝试使用'long long'。


它运行了!感谢所有建议这个的人,真是太棒了。让我更加欣赏Java... - rhodri
@rhodri:顺便说一下,long long甚至不一定是64位(在某些实现中)。请查看Boost Integer或查看您的编译器是否有stdint.h。 - GManNickG
1
@GMan:正确。然而,C标准保证long long具有足够的范围来表示64位整数,而这通常已经足够了... - sleske

4

类型long不一定是64位。如果你在32位架构上(至少在MS Visual C ++上),long类型为32位。可以用sizeof(long)检查它的大小。还有long long数据类型可能会有所帮助。


2

你可能使用的是32位长整型。尝试使用long long代替。

98301 * 32767 = 3221028867,而32位长整型在2147483648处溢出。


2

C标准只保证long至少有32位(实际上在大多数32位平台上都是这样)。

如果您需要64位,请使用long long。它保证至少拥有64位。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接