Нет ошибки. Это только означает, что подписанный тип long int в вашей системе имеет такую же ширину, что и тип int. В результате объект типа long int не может представить такое положительное число.
Таким образом, вместо типа long int вы можете использовать тип long long int, например,
long long L = 2500000000;
fprintf( stderr, "L is %lld\n", L );
Обратите внимание, что суффикс 'L' лучше исключать из целочисленного литерала. Компилятор сам определит тип константы.
Если целочисленный литерал не имеет суффикса, то из этих типов определяется его тип относительно того, какой тип может представлять значение
int int
long int
long long int
Чтобы проверить, какой целочисленный тип со знаком может вместить такую константу, запустите следующую демонстрационную программу
#include <iostream>
#include <limits>
int main()
{
std::cout << 2500000000 << '\n';
std::cout << std::numeric_limits<int>::max() << '\n';
std::cout << std::numeric_limits<long>::max() << '\n';
std::cout << std::numeric_limits<long long>::max() << '\n';
return 0;
}
Другой подход к определению типа константы заключается в использовании стандартного класса std::is_same
, объявленного в заголовке. <type_trais>
.
Вот демонстрационная программа
#include <iostream>
#include <iomanip>
#include <type_traits>
int main()
{
std::cout << 2500000000 << '\n';
std::cout << std::boolalpha << std::is_same<int, decltype( 2500000000 )>::value << '\n';
std::cout << std::boolalpha << std::is_same<long, decltype( 2500000000 )>::value << '\n';
std::cout << std::boolalpha << std::is_same<long long, decltype( 2500000000 )>::value << '\n';
return 0;
}
Так что, если использовать вызов printf, требующий указать спецификатор преобразования для выведенного объекта, вы можете написать
auto L = 2500000000;
if ( std::is_same<long, decltype( L )>::value )
{
fprintf( stderr, "L is %ld\n", L );
}
else if ( std::is_same<long long, decltype( L )>::value )
{
fprintf( stderr, "L is %lld\n", L );
}