Определите целое число 64-битной ширины в Linux - PullRequest
2 голосов
/ 27 февраля 2010

Я пытаюсь определить 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

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

С наилучшими пожеланиями,

Ответы [ 4 ]

11 голосов
/ 27 февраля 2010
   long long max=9223372036854775808LL; // Note the LL
// long max=9223372036854775808L; // Note the L

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

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

5 голосов
/ 28 февраля 2010

Проблема, с которой вы столкнулись, заключается в том, что используемое вами число (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 бит (оба, включая знаковый бит).

0 голосов
/ 27 февраля 2010

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

0 голосов
/ 27 февраля 2010

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

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

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

Как видите, он читабелен.

Для отображения значения:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...