2010-07-26 87 views
2

已知长双位使用80位。C中的数据类型

2^80 = 1208925819614629174706176;

为什么,声明一个变量,例如当:

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

我得到一个警告说:整型常量是其类型太大。

+4

尝试使用长双字面代替... – Cogwheel 2010-07-26 21:41:51

+1

由于浮点数的存储方式(尾数+指数),计算2^80-1不会给你它可以存储的最大数量。它根本不会给你任何相关的东西。 – rmeador 2010-07-26 21:54:48

回答

15

1208925819614629174706175是一个整数字面值,而不是double值。你的程序会很高兴地转换它,但它必须是一个有效的整数。相反,请使用长双字面值:1208925819614629174706175.0L

+1

啊,打我吧+1 – Marcin 2010-07-26 21:45:16

+0

长久久久? – 2010-07-26 22:51:35

+0

@Chris,如果这个数字实际上是2^80,它恰好适用于任何浮点类型,甚至是32位浮点数。 – 2010-07-27 05:55:38

2

首先将值1208925819614629174706175作为const int进行提炼,然后在分配发生时将其转换为长整数double。

5

首先,我们不知道一个long double类型正在使用多少位。这取决于实施。其次,仅仅因为某些浮点类型使用了一些特定数量的位,并不意味着这种类型可以使用所有这些位精确地表示一个整数值(如果这是您想要的)。浮点类型被称为浮点类型,因为它们表示非整数值,这通常意味着不平凡的内部表示。由于该表示的具体情况,这些位中只有一部分可用于数字的实际数字。这意味着您的2^80 - 1号码将以某种方式被截断/舍入。所以,不管你如何做,不要惊讶,如果编译器警告你关于数据丢失。

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