Определите целое число 64-битной ширины в Linux

Я пытаюсь определить 64-битное целое число, используя язык C на Ubnutu 9.10. 9223372036854775808 - 2^23

long long max=9223372036854775808
long max=9223372036854775808

Когда я его скомпилировал, компилятор выдал предупреждение:

binary.c:79:19: warning: integer constant is so large that it is unsigned
binary.c: In function ‘bitReversal’:
binary.c:79: warning: this decimal constant is unsigned only in ISO C90
binary.c:79: warning: integer constant is too large for ‘long’ type

Является ли длина типа 64-битной шириной?

С уважением,

4 ответа

Решение
   long long max=9223372036854775808LL; // Note the LL
// long max=9223372036854775808L; // Note the L

long long тип не менее 64 бит, long тип не менее 32 бит. Фактическая ширина зависит от компилятора и целевой платформы.

использование int64_t а также int32_t чтобы гарантировать, что 64-/32-битное целое число может поместиться в переменную.

Проблема в том, что используемый вами номер (9223372036854775808) 2**63и максимальное значение, которое ваш long long может содержать (как 64-битный подписанный тип дополнения 2s) на единицу меньше этого - 2**63 - 1или 9223372036854775807 (это 63 двоичных единицы подряд).

Слишком большие константы для long long (как в этом случае) заданного типа unsigned long longВот почему вы получаете предупреждение integer constant is so large that it is unsigned,

long тип не менее 32 бит, а long long введите не менее 64 бит (оба, включая знаковый бит).

Я не уверен, что это решит вашу проблему (решение LL выглядит хорошо). Но вот рекомендация:

Вы должны использовать шестнадцатеричное обозначение, чтобы записать максимальное значение чего-либо.

unsigned char max = 0xFF;
unsigned short max = 0xFFFF;
uint32_t max = 0xFFFFFFFF;
uint64_t max = 0xFFFFFFFFFFFFFFFF;

Как вы можете видеть, это читабельно.

Чтобы отобразить значение:

printf("%lld\n", value_of_64b_int);

Я думаю, это зависит от того, какую платформу вы используете. Если вам нужно точно знать, какой тип целочисленного типа вы используете, вы должны использовать типы из Stdint.h, если у вас есть этот файл включения в вашей системе.

Другие вопросы по тегам