Можно ли создать переменную нестандартного размера в c? - PullRequest
5 голосов
/ 03 августа 2020

Добрый вечер, заранее извините, если у меня плохой английский sh, я француз.

Итак, в C есть разные типы переменных, например int, long,. .. Это занимает несколько байтов в зависимости от типа, и, если я не ошибаюсь, "самый большой" тип - это long long int (или просто long long), который занимает 8 байтов памяти (например, long, что странно, поэтому, если кто-то мог бы объяснить мне это тоже спасибо)

Итак, мой первый вопрос: могу ли я создать свой собственный тип переменной, который занимает, например, 16 байтов, или я вынужден использовать строки, если число слишком велико в течение длительного времени (или беззнаковый длинный длинный)?

Ответы [ 2 ]

9 голосов
/ 03 августа 2020

Вы можете создавать любые пользовательские типы, и если вам нужен «целочисленный» тип шириной 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.)

0 голосов
/ 04 августа 2020

Очевидно, вы можете. По желанию вы не должны использовать строку, потому что вычисления с ней будут намного сложнее и медленнее. может быть громоздким, если вы используете самый большой тип данных.

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