Подтвердить что ты не робот

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

Я пытаюсь использовать 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));

Я получаю ответ:

Размер long int: 4 Размер long long int: 8

Это заставляет меня чувствовать, что длинный длинный 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 type

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

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

[email protected]:~$ 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-битные целые числа доступны мне, я бы очень признателен за любую помощь. Спасибо....

4b9b3361

Ответ 1

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

#include <stdint.h>

int64_t i2 = 0x0000444400004444LL;

Ответ 2

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

long long int i2 = 0x0000444400004444LL;

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

Ответ 3

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

int64_t var = 0x0000444400004444LL;

Для печати:

#define __STDC_FORMAT_MACROS
#include <inttypes.h>

printf("blabla %" PRIi64 " blabla\n", var);

Ответ 4

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

Против обычной хорошей идеи добавить LL.

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

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

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);
}

Выход

9223372036854775807
0x867530900000000

Ответ 5

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