У меня проблема в том, чтобы создать что-то вроде большой целочисленной библиотеки. Я хочу сделать его кроссплатформенным и максимально быстрым. Это означает, что я должен попытаться выполнить математику с такими большими типами данных, которые изначально поддерживаются в системе.
На самом деле я не хочу знать, собираюсь ли я для 32-битной или 64-битной системы; все, что мне нужно, это способ создать 64-битное или 32-битное или любое другое целое число бит на основе того, что является наибольшим из доступных. Я буду использовать sizeof, чтобы вести себя по-разному, в зависимости от того, что это такое.
Вот некоторые возможные решения и их проблемы:
Используйте sizeof (void *):
Это дает размер указателя на память. Возможно (хотя и маловероятно), что система может иметь больше указателей на память, чем она способна выполнять математику или наоборот.
Всегда используйте долго:
Хотя верно, что на нескольких платформах длинные целые числа составляют 4 байта или 8 байтов в зависимости от архитектуры (моя система - один из таких примеров), некоторые компиляторы реализуют длинные целые числа как 4 байта даже в 64-битных системах.
Всегда используйте long long:
Во многих 32-битных системах это 64-битное целое число, которое может быть не таким эффективным (хотя, вероятно, более эффективным, чем любой код, который я могу писать). Реальная проблема с этим заключается в том, что он может вообще не поддерживаться на некоторых архитектурах (например, на тех, на которых работает мой mp3-плеер).
Чтобы подчеркнуть, мой код не заботится о том, каков фактический размер целого числа после того, как он был выбран (он полагается на sizeof () для всего, что имеет значение). Я просто хочу, чтобы он выбрал тип целого числа, который сделает мой код наиболее эффективным.