Для представления вашей константы 10000000000000000000
требуется 64 бита. В шестнадцатеричном формате это 0x8ac7230489e80000
. Он может быть представлен в 64-битном типе unsigned, но не в 64-битном типе signed.
Начиная с C99, все целочисленные константы имеют некоторый тип со знаком: первый из int
, long int
или long long int
, в котором значение будет соответствовать.
У C90 (у которого еще не было long long int
) были другие правила. В C90 десятичная целочисленная константа без суффикса имеет тип int
, long int
или unsigned long int
.
Режим gcc по умолчанию — -std=gnu90
, который поддерживает стандарт C90 и расширения, специфичные для GNU. Если вы работаете в 64-битной системе, long
и unsigned long
являются 64-битными. В соответствии с правилами C90 ваша константа имеет тип unsigned long
(при условии, что unsigned long
имеет длину не менее 64 бит). В соответствии с правилами C99 и более поздних версий, если не существует целочисленного типа шире 64 бит, это является нарушением ограничения. (версия gcc 5 изменила значение по умолчанию на -std=gnu11
.)
Компилятор, который, по-видимому, работает по правилам C90, предупреждает вас, что значение 10000000000000000000
различается в зависимости от того, в какой редакции стандарта работает компилятор.
Вы можете заставить свою программу «работать» со следующими изменениями:
#define POWER 10000000000000000000ULL // suffix to specify the type
...
for (unsigned long long = 0; i < POWER; i ++)
...
Но хотя это делает программу действительной, это не делает ее практичной. При одной итерации в наносекунду для завершения этого цикла потребуется более 3 столетий. Мой собственный достаточно современный компьютер выполняет одну итерацию пустого цикла for
примерно за 1,6 наносекунды. Какую бы проблему вы ни пытались решить, я предлагаю либо найти другой способ ее решения, либо свести ее к меньшей проблеме. Самый быстрый способ выполнить этот цикл — подождать несколько десятилетий, пока оборудование станет быстрее, а затем затем скомпилировать и выполнить его.
(Это предполагает, что тело цикла нетривиально. Если тело цикла ничего не делает, компилятор может вообще оптимизировать цикл.)
person
Keith Thompson
schedule
19.04.2016
10000000000000000000
раз?for (long i = 0; ; i++)
технически будет делать то же самое (бесконечный цикл) - person Dmitry Bychenko   schedule 19.04.2016#define POWER 10000000000000000000
--››#define POWER 10000000000000000000ULL
иint i;
--››unsigned long long i;
- person joop   schedule 19.04.2016it
? Я попытался объявить его какunsigned int
, но предупреждения остались. Является лиit
переменнойi
или константойPOWER
? - person chux - Reinstate Monica   schedule 19.04.2016