2009-11-07 2 views
1

Я новичок в разработке Windows, и я довольно смущен.Почему я получаю «постоянную слишком большую» ошибку?

Когда я компилирую этот код с Visual C++ 2010, я получаю сообщение об ошибке «constant too large». Почему я получаю эту ошибку и как ее исправить?

Спасибо!

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    unsigned long long foo = 142385141589604466688ULL; 
    return 0; 
} 
+0

Вы достигли предела своих аппаратных средств для представления целых чисел. Вне 64 бит требуется, чтобы целое число моделировалось конструкциями программного обеспечения. –

ответ

9

Разряд последовательность вы выражающий бы около 67 бит - (!), Может быть, ваш «неподписанный долго долго» типа занимает только 64 бита, ваша последовательность цифр не будет вписываться в его, и т.д., и т.д. .

Если вам регулярно нужно иметь дело с целыми числами, которые не подходят для 64 бит, вам может потребоваться изучить языки, которые плавно поддерживают их, например Python (возможно, с помощью gmpy ;-). Или откажитесь от языковой поддержки и перейдите на подходящие библиотеки, такие как GMP и MPIR! -)

4

Длинный длинный 64 бит и, следовательно, имеет максимальное значение 2^64, что составляет 9223372036854775807 в качестве знакового значения и 18446744073709551615 как значение без знака. Ваше значение больше, поэтому это постоянное значение, которое слишком велико.

Выберите другой тип данных, чтобы сохранить свое значение.

+2

Будьте осторожны, как вы это говорите. Долгий длинный, по-видимому, 64 бит на аппаратном обеспечении OP. C++ не определяет ограничение максимального размера для долгого времени. –

+0

Совершенно верно. В моей защите: я понимаю, что Visual C++ определяет длинные 64 бита, а OP специально помечен как Visual C++. – Andrew

2

Вы получаете ошибку, потому что ваша константа слишком велика.

От Wikipedia: unsigned long long «s максимальное значение составляет по меньшей мере 18.446.744.073.709.551.615

Здесь максимальное значение и ваше значение:

18,446,744,073,709,551,615 // Max value 
142,385,141,589,604,466,688 // Your value 

Узнайте, почему ваше значение слишком долго?

+0

+1 Пожалуйста, измените «... на 18, ...» на «... не менее 18, ...». long long имеет * не менее * 64 бит, а в случае OP, вероятно, точно 64 бит. – sellibitze

+0

долгий срок не ограничивается 64 языком. Я использую несколько систем, где это 128 бит. Это предел аппаратного обеспечения, используемого OP. –

0

Вы достигли предела своих аппаратных средств для представления целых чисел непосредственно.

Кажется, что за пределами 64 бит (на вашем оборудовании) требуется, чтобы целое число моделировалось конструкциями программного обеспечения. Там есть несколько проектов.

См BigInt
http://sourceforge.net/projects/cpp-bigint/

Примечание: Другие неправильно истолкованы, что долго долго имеет предел в 64 бита.
Это неточно. Единственное ограничение размещаемых языка:
(Также Примечание: В настоящее время C++ не поддерживает долго долго (но C делает) Это расширение вашего компилятора (прибывающее в следующей версии стандарта))

sizeof(long) <= sizeof(long long) 
sizeof(long long) * CHAR_BITS >= 64 // Not defined explicitly but deducible from 
             // The values defined in limits.h 

для получения более подробной информации см:
What is the difference between an int and a long in C++?

Смежные вопросы