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