1
#include <stdio.h>

int main()
{
    long double n = (long double)1208925819614629174706175; // (1<<80)-1 (generated in python)
    printf("%LG\n",n);
}

在用 gcc 编译时,我收到一个警告

test.c:5:31: warning: integer constant is too large for its type [enabled by default]

运行时打印-1

在做 asizeof(long double)时,它会打印12. 所以一个签名long double应该容纳(1<<83)-1对吗?

如何让它正常工作?

PS:我正在处理的原始问题是处理存储大至12*(10 18 ) 的有符号整数。我不想编写乘法、加法和其他计算例程。那么我该怎么做呢?

4

2 回答 2

2

Starbolin 是正确的,但我认为需要对这个表达式进行详细解释:

在 C 中,数字常量(不带小数点)的类型为intlong,具体取决于值。
你使用的常数 ,1208925819614629174706175甚至对于 来说都太大了long,所以它被截断了。
所有这些都发生在投射到long double和分配到之前n
当浮点类型进入画面时,数值常量已经被截断,丢失的位再也回不来了。

发生这种情况是因为 C 是一种简单的语言,它在编译期间遵循简单定义的步骤。编译器不会“窥视”来查看数字常量将被强制转换为long double. 它首先将其视为long,然后继续。

于 2012-06-06T07:33:15.830 回答
2

Long double 将处理 10**300 及以上,这不是编译器所抱怨的。它说您尝试转换为 long 的整数对于整数来说太大了。(提示 - 添加小数点) – starbolin  

于 2012-06-06T04:12:33.040 回答