Поскольку постоянная 1
является int
, при смещении влево она остается int
. Если вы хотите unsigned long long
, сделать это такое:
unsigned long long mpy = 1ULL << multiplier++;
Вы можете использовать один из суффиксов L
или UL
или LL
для long
, unsigned long
и long long
вместо (и строчные версии этих, но суффикс лучше написано в верхнем регистре, чтобы избежать путаницы l
и 1
). Выбор зависит от того, что вы действительно пытаетесь сделать.
Обратите внимание, что тип результата <<
- это тип левого операнда. Результат сдвига только затем преобразуется в тип левой стороны оператора присваивания. LHS присвоения не влияет на то, как рассчитывается значение для RHS.
Как user3528438 отметил в comment, и, как я предположил (возможно, ошибочно), вы бы знали - если multiplier
(правая часть оператора <<
) оценивает отрицательное значение или значение, равное или больше, чем число бит в целочисленном типе, тогда вы вызываете неопределенное поведение.
Отметьте, что long long
и unsigned long long
являются стандартными в старом стандарте десятилетия и с половиной лет (C99) и более новым стандартом C11, но они не были частью стандарта C89/C90 четверти века. Если вы застряли на платформе, где компилятор находится в дате окончания периода времени в 2013 году и в стандартной версии совместимости C 1990 года, тогда вам нужно пойти на альтернативные 64-битные методы, ориентированные на платформу. Цикл в обновленном вопросе охватывает 33 значения, так как вы считаете от 32 до 0. В 32-битном типе не должно быть разных значений для каждой из 33 смен.
(Продвинутые пользователи могут быть заинтересованы в INT35-C Use correct integer precisions и N1899 — Integer precision bits update; они для некоторых людей являются таинственными эзотериками.Я не уверен, что мне когда-нибудь понадобится беспокоиться по поводу поднятой проблемы.)
Обратите внимание на обсуждение ниже printf()
форматов. Вы должны убедиться, что вы печатаете значение с правильным форматом. Для long int
, который должен быть %ld
; для unsigned long long
, это будет %llu
. Другие типы требуют других форматов. Убедитесь, что вы используете разумные параметры предупреждения компилятора. Если вы используете GCC, вы должны посмотреть на gcc -Wall -Wextra -Werror -std=c11
как довольно эффективный набор опций; Я использую несколько более строгие параметры, чем те, что я компилирую код C.
Просьба представить полный, минимальный и поддающийся проверке пример. –
как долго длится? – user3528438
Я сделал Даниил, хотя вам просто нужно было его зацикливать до тех пор, пока он не переполнится как подписанный int – Maxitj