Вы можете создавать любые пользовательские типы, и если вам нужен «целочисленный» тип шириной 16 байт, вы можете создать настраиваемую структуру и соединить две long long
s вместе. Но тогда вам придется реализовать все арифметические c для этих типов вручную. Это было довольно распространено в прошлом, когда наиболее распространены были 16-битные (и даже 32-битные) машины, у вас были библиотеки bigint, которые могли бы выполнять как 64-битную целочисленную математику. Это менее полезно сейчас, когда большинство машин либо 64-битные, либо long long
изначально поддерживают 32-битные цели.
Раньше вы часто видели библиотеки с такими вещами:
typedef struct _BigInt {
unsigned long long high;
unsigned long long low;
} BigInt;
// Arithmetic functions:
BigInt BigIntAdd(BigInt a, BigInt b);
// etc.
Они несколько сошли на нет, потому что текущая типичная ширина регистра ЦП составляет 64 бита, что позволяет использовать огромный диапазон значений, и, если вы не работаете с очень специализированными данными, в обычных задачах программирования больше не «распространено» необходимость значений вне этот диапазон. Поскольку @datenwolf является явным и правильным в комментариях ниже, если вы обнаружите необходимость в такой функциональности в производственном коде, поищите для нее надежную и отлаженную библиотеку. (Написание собственного может быть забавным упражнением, хотя подобные вещи, скорее всего, станут фермой ошибок, если вы попытаетесь просто ускорить это как быстрый шаг на пути к другой работе.) Как указывает Эри c P в комментарии выше, clang предлагает собственный способ сделать это без сторонней библиотеки.
(Странные двусмысленности или эквивалентности относительно ширины long
и long long
в основном исторические , и если вы не развивались с платформами, это сбивает с толку и отчасти ненужно. См. комментарий к вопросу об этом - стандарт C определяет минимальные размеры для целочисленных типов, но не говорит, что они должны быть разными друг от друга; исторически типы char
, short
, int
, long
и long long
часто были полезными способами различать, например, 8, 16, 32 и 64-битные размеры, но это немного беспорядок теперь, и если вы хотите, чтобы современные платформы определенного размера предоставляли uint32_t
, чтобы гарантировать размер, вместо использования типов "classi c" C.)