Для вашей постоянной константы 10000000000000000000
требуется 64 бит. В шестнадцатеричном виде это 0x8ac7230489e80000
. Он может быть представлен в неподписанным 64-разрядным типом, но не в подписанном 64-разрядным типом.
С 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 наносекунды. Какую бы проблему вы ни пытались решить, я предлагаю либо найти другой способ ее решения, либо уменьшить ее до меньшей проблемы. Самый быстрый способ выполнить этот цикл - подождать несколько десятилетий, чтобы оборудование стало быстрее, и затем скомпилировать и выполнить его.
(Это предполагает, что тело цикла является нетривиальным. Если тело цикла не делает ничего, компилятор может оптимизировать на цикл в целом.)
вы действительно хотите, чтобы петли '10000000000000000000' раз? 'for (long i = 0;; i ++)' будет, технически, делать то же самое (бесконечный цикл) –
@DmitryBychenko Я пытаюсь выполнить итерацию по очень большим числам, так что да, мне нужно так много циклов. – Marievi
'#define POWER 10000000000000000000' - >>' #define POWER 10000000000000000000ULL' и 'int i;' - >> 'unsigned long long i;' – joop