Определите целое число 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, если у вас есть этот файл включения в вашей системе.