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