Как указать 64-битные целые числа в c - PullRequest
46 голосов
/ 07 марта 2012

Я пытаюсь использовать 64-битные целые числа в C, но получаю смешанные сигналы относительно того, должно ли это быть возможно.

Когда я выполняю printf:

printf("Size of long int:%d\nSize of long long int:%d\n\n",(int)sizeof(long int), (int)sizeof(long long int));

Ответ, который я получаю:

Размер длинного целого: 4 Размер long long int: 8

Это заставляет меня чувствовать, что long long int имеет 8 байтов = 64 бита.

Однако, когда я пытаюсь объявить следующие переменные:

long long int a2 = 0x00004444;
long long int b2 = 0x000044440;
long long int c2 = 0x0000444400;
long long int d2 = 0x00004444000;
long long int e2 = 0x000044440000;
long long int f2 = 0x0000444400004;
long long int g2 = 0x00004444000044;
long long int h2 = 0x000044440000444;
long long int i2 = 0x0000444400004444;

Последние 4 переменные (f2, g2, h2, i2) дают мне сообщение об ошибке:

предупреждение: целочисленная константа слишком велика для типа "long"

Я получаю тот же результат, когда заменяю long long int на int64_t. Я предполагаю, что 'int64_t' был распознан, так как он не генерировал никаких собственных сообщений об ошибках.

Итак, кажется, что мое 8-байтовое длинное int действительно 6-байтовое длинное int, и я не понимаю, чего мне здесь не хватает. Если это поможет, вот информация о моем компиляторе gcc:

me@ubuntu:~$ gcc -v  
Using built-in specs.  
Target: i686-linux-gnu  
Configured with: ../src/configure -v   
--with-pkgversion='Ubuntu/Linaro 4.4.4-14ubuntu5'  
--with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs   
--enable-languages=c,c++,fortran,objc,obj-c++  
--prefix=/usr   
--program-suffix=-4.4   
--enable-shared   
--enable-multiarch   
--enable-linker-build-id   
--with-system-zlib   
--libexecdir=/usr/lib   
--without-included-gettext   
--enable-threads=posix   
--with-gxx-include-dir=/usr/include/c++/4.4   
--libdir=/usr/lib   
--enable-nls   
--with-sysroot=/ -  
-enable-clocale=gnu   
--enable-libstdcxx-debug   
--enable-objc-gc   
--enable-targets=all 
--disable-werror   
--with-arch-32=i686   
--with-tune=generic   
--enable-checking=release   
--build=i686-linux-gnu   
--host=i686-linux-gnu   
--target=i686-linux-gnu  
Thread model: posix  
gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5)   

Если кто-нибудь знает, как (или если) мне доступны 64-битные целые числа, я бы очень признателен за любую помощь. Спасибо ....

Ответы [ 5 ]

68 голосов
/ 07 марта 2012

Используйте stdint.h для определенных размеров целочисленных типов данных, а также используйте соответствующие суффиксы для целочисленных литеральных констант, например ::10000

#include <stdint.h>

int64_t i2 = 0x0000444400004444LL;
28 голосов
/ 07 марта 2012

Попробуйте суффикс LL на числе, компилятор может приводить его к промежуточному типу как часть анализа. Смотри http://gcc.gnu.org/onlinedocs/gcc/Long-Long.html

long long int i2 = 0x0000444400004444LL;

Кроме того, компилятор отбрасывает лидирующие нули, поэтому 0x000044440000 становится 0x44440000, что является вполне приемлемым 32-разрядным целым числом (поэтому вы не видите никаких предупреждений до f2) .

5 голосов
/ 07 марта 2012

Используйте int64_t, этот портативный код C99.

int64_t var = 0x0000444400004444LL;

Для печати:

#define __STDC_FORMAT_MACROS
#include <inttypes.h>

printf("blabla %" PRIi64 " blabla\n", var);
3 голосов
/ 16 июня 2017

Как указать 64-битные целые числа в c

В отличие от обычный хорошая идея для добавления LL.

Добавление LL до целочисленной константы обеспечит тип по крайней мере такой же ширины, как long long.Если целочисленная константа является восьмеричной или шестнадцатеричной, константа при необходимости станет unsigned long long.

Если не требуется указывать слишком широкий тип, то LLвсе в порядке. иначе, читайте дальше.

long long может быть шире, чем 64-битный.

Сегодня редко бывает, что long long не является 64-битным, однакоC указывает, что long long будет по крайней мере 64-бит.Поэтому, используя LL, в будущем код может указывать, скажем, 128-битное число.

C имеет Макросы для целочисленных констант , которые в приведенном ниже случае будут иметь тип int_least64_t

#include <stdint.h>
#include <inttypes.h>

int main(void) {
  int64_t big = INT64_C(9223372036854775807);
  printf("%" PRId64 "\n", big);
  uint64_t jenny = INT64_C(0x08675309) << 32;  // shift was done on at least 64-bit type 
  printf("0x%" PRIX64 "\n", jenny);
}

output

9223372036854775807
0x867530900000000
1 голос
/ 10 мая 2012

Добавить суффикс ll к шестнадцатеричным цифрам для 64-битных (long long int), или суффикс ULL для 64-разрядного без знака (длинный без знака)

...