C中的数据类型

时间:2010-07-26 21:39:06

标签: c types double long-integer

已知长双倍使用80位。

2 ^ 80 = 1208925819614629174706176;

为什么,在声明变量时如:

    long double a = 1208925819614629174706175; // 2^80 - 1

我收到一条警告说:整数常数对于它的类型来说太大了。

3 个答案:

答案 0 :(得分:15)

1208925819614629174706175是一个整数文字,而不是双精度。你的程序很乐意转换它,但它必须首先是一个有效的整数。相反,请使用长双字词:1208925819614629174706175.0L

答案 1 :(得分:5)

首先,不知道long double类型使用了多少位。这取决于实施。

其次,仅仅因为某些浮点类型使用某些特定数量的位,并不意味着此类型可以使用所有这些位精确地表示整数值(如果这是您想要的)。浮点类型称为浮点类型,因为它们表示非整数值,这通常意味着非平凡的内部表示。由于该表示的细节,这些比特中只有一部分可用于该数字的实际数字。这意味着您的2^80 - 1号码将以某种方式被截断/舍入。因此,无论您如何操作,如果编译器警告您数据丢失,请不要感到惊讶。

第三,正如其他答案已经注意到的那样,您在程序文本中使用的常量是积分常量。对该常量施加的限制与浮点类型完全无关。使用浮点常量而不是整数常量。

答案 2 :(得分:2)

值1208925819614629174706175首先作为const int创建,然后在赋值发生时转换为long double。