#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
在执行sizeof(long double)
时,会打印12
。
那么签名的long double
应该适应(1 <&lt;&lt;&lt; 83)-1 吧?
如何让它正常工作?
PS:我正在研究的原始问题,处理存储的有符号整数,大小为 12 *(10 18 )。我不想写乘法,加法和其他计算例程。那我该怎么做呢?
答案 0 :(得分:2)
Long double将处理10 ** 300及以上,这不是编译器所抱怨的。它表示您尝试强制转换为long的整数对于整数来说太大了。 (提示 - 添加小数点) - starbolin
答案 1 :(得分:2)
Starbolin是正确的,但我认为需要对此表达式进行详细解释:
在C中,数字常量(不带小数点)的类型为int
或long
,具体取决于值。
你使用的常量1208925819614629174706175
对long
来说太大了,所以它被截断了。
所有这些都在转换为long double
并分配给n
之前发生
当浮点类型进入图片时,数字常量已被截断,丢失的位不能返回。
这是因为C是一种简单的语言,它遵循编译过程中简单定义的步骤。编译器没有“向前看”以查看将数字常量强制转换为long double
。它首先将其视为long
,然后继续。