«long long int» интерпретируется как «long int». Как мне обойти это? - PullRequest
5 голосов
/ 10 марта 2010

Я работаю над проектом по программированию для моего курса математики в университете. Мне нужно иметь возможность обрабатывать большие целые числа, большие, чем те, которые могут храниться в типе данных long int. Поэтому я попытался использовать long long int, но если я попробую что-то вроде этого:

long long int number;
number = 10000000000;

Затем в сообщении об ошибке говорится: 'error: целочисленная константа слишком велика для типа "long" * .

Я пробовал другие типы данных, такие как '___int64' и 'int_64t', я пытался включить все стандартные библиотеки c, но у меня все еще возникает та же проблема.

Странно, когда я пытаюсь 'printf("LLONG_MAX = %lld\n", LLONG_MAX);', я получаю это:

LLONG_MAX = -1

Я использую Codeblocks 8.02 на Windows XP, но я не уверен, какая версия компилятора gcc установлена, поскольку я использую сетевые компьютеры в кампусе и у меня нет прав доступа к основной файловой системе. Я не хочу приносить свой ноутбук в кампус каждый день. Пожалуйста помоги! Спасибо

Ответы [ 8 ]

11 голосов
/ 10 марта 2010

Когда компилятор компилирует ваш C-файл и встречает целочисленную константу или константу с плавающей запятой, он должен назначить ему тип. Он неявно выберет тип по умолчанию для вас. Вы можете явно установить тип, предоставив компилятору суффикс integer . Целочисленный суффикс может сказать компилятору, является ли он длинным, длинный длинный или беззнаковый тип.

  • 10 неявно является целым числом со знаком
  • 10u, 10U - это целое число без знака
  • 10l, 10L явно длинное целое число со знаком
  • 10ll, 10LL или 10i64 на win32 - это явно длинное целое число со знаком
  • 10ull явно является длинным без знака

Типы с плавающей точкой также имеют такую ​​ситуацию. Тип может быть плавающим, двойным или длинный двойной. Тип с плавающей точкой обычно по умолчанию удваивается.

  • 10.0 неявно является двойным
  • 10.0f или 10.0F - это явно число с плавающей точкой
  • 10.0l или 10.0L явно длинный двойной
3 голосов
/ 10 марта 2010

Добавьте ll в конце вашей целочисленной константы.

1 голос
/ 10 марта 2010

В среде Microsoft используйте printf с этим синтаксисом:

    __int64 i64 = 10000000000;
    unsigned __int64 u64 = 10000000000000000000;

    printf ( "%I64d\n", i64 );
    printf ( "%I64u\n", u64 );
    printf ( "%I64d\n", u64 ); <-- note this typo

0 голосов
/ 10 марта 2010

Как уже писали люди, вы должны проверить, какой компилятор вы используете. В Code: Blocks вы делаете (в моем случае, в любом случае, надеюсь, это будет работать и для вас):

Сначала выясните, какой компилятор выбран для вашего проекта, выбрав Project-> Build options ... и посмотрите, что написано в "Выбранном компиляторе"

Затем выберите: Настройки-> Компилятор и отладчик ... и выберите только что обнаруженный компилятор. Затем нажмите «Исполняемые файлы Toolchain» и посмотрите, что там написано, например. "Компилятор C".

Может быть, если вам это удастся, и опубликуйте свои результаты, кто-то здесь сможет вам помочь.

0 голосов
/ 10 марта 2010

В дополнение к предыдущим комментариям о суффиксах и режиме gcc C99, если вы не можете долго работать, и вам нужны только целые числа до 2 ^ 52, вы можете обойтись без использования double.Целые числа до 2 ^ 52 должны быть точно представлены как двойные, предполагая формат двойной точности IEEE (показатель смещения 0 +1).

0 голосов
/ 10 марта 2010

Возможно, компилятор смущен частью int типа данных - вы пробовали использовать long long вместо этого?

Этот сайт может вам помочь.

0 голосов
/ 10 марта 2010

Вы должны иметь возможность использовать long long int с компилятором gcc, но я думаю, что это может потребовать использования кода c99 std, где по умолчанию может быть режим c89. попробуйте добавить --std = c99 в командную строку вашего компилятора и посмотрите, поможет ли это: -)

0 голосов
/ 10 марта 2010

Гм, Code :: Blocks использует GCC в качестве обычного компилятора. И последние версии этого явно поддерживают 64-битные типы.

Так что вы должны быть в состоянии

#include <inttypes.h>
uint64_t unsigned64BitNumber;
int64_t signed64BitNumber;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...