Ответ 1
Используйте stdint.h
для конкретных размеров целочисленных типов данных, а также используйте соответствующие суффиксы для констант целочисленного литерала, например:
#include <stdint.h>
int64_t i2 = 0x0000444400004444LL;
Я пытаюсь использовать 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-битные целые числа доступны мне, я бы очень признателен за любую помощь. Спасибо....
Используйте stdint.h
для конкретных размеров целочисленных типов данных, а также используйте соответствующие суффиксы для констант целочисленного литерала, например:
#include <stdint.h>
int64_t i2 = 0x0000444400004444LL;
Попробуйте суффикс LL
на номере, компилятор может передать его промежуточному типу в качестве части анализа. См. http://gcc.gnu.org/onlinedocs/gcc/Long-Long.html
long long int i2 = 0x0000444400004444LL;
Кроме того, компилятор отбрасывает ведущие нули, поэтому 0x000044440000
становится 0x44440000
, что является вполне приемлемым 32-разрядным целым числом (поэтому вы не видите никаких предупреждений до f2
).
Используйте int64_t
, этот переносимый код C99.
int64_t var = 0x0000444400004444LL;
Для печати:
#define __STDC_FORMAT_MACROS
#include <inttypes.h>
printf("blabla %" PRIi64 " blabla\n", var);
Как указать 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
Добавить ll-суффикс в шестнадцатеричные цифры для 64-битного (long long int), или ull suffix для беззнакового 64-битного (unsigned long long)