Во-первых, неизвестно, сколько бит использует тип long double
. Это зависит от реализации.
Во-вторых, только потому, что какой-то тип с плавающей запятой использует определенное количество бит, это не означает, что этот тип может точно представлять целочисленное значение, используя все эти биты (если это то, что вы хотите). Типы с плавающей точкой называются типами с плавающей точкой, поскольку они представляют собой нецелые значения, что обычно подразумевает нетривиальное внутреннее представление. Из-за специфики этого представления только часть этих битов может использоваться для фактических цифр номера. Это означает, что ваш номер 2^80 - 1
будет усечен/округлен в той или иной форме. Поэтому, независимо от того, как вы это делаете, не удивляйтесь, если компилятор предупреждает вас об утрате данных.
В-третьих, как уже отмечалось в других ответах, константа, которую вы используете в тексте своей программы, является константой . Ограничения, налагаемые на эту константу, не имеют ничего общего с типами с плавающей точкой. Используйте константу с плавающей запятой, а не интегральную.
Попробуйте использовать длинный двойной литерал вместо ... – Cogwheel
из-за сохранения чисел с плавающей запятой (мантисса + экспонента), вычисление 2^80-1 не даст вам максимального количества, которое оно может сохранить. На самом деле это не даст вам ничего актуального. – rmeador