То, о чем ты просишь, невозможно. Как уже говорилось ранее, любая реализация C, соответствующая стандартам, будет правильно определена как limits.h
. Если это неверно по какой-либо причине, виноват поставщик компилятора. Любое «динамическое» обнаружение истинных пределов было бы невозможно во время компиляции, особенно если вы выполняете кросс-компиляцию для встроенной системы, и, следовательно, целевая архитектура может иметь меньшие целые числа, чем система компиляции.
Чтобы динамически определять пределы, вам придется делать это во время выполнения, сдвигая, умножая или добавляя биты, пока не встретится переполнение, но тогда у вас есть переменная в памяти, а не константа, что было бы значительно помедленнее. (В любом случае это было бы ненадежно, поскольку в разных архитектурах используются разные представления на уровне битов, а арифметика иногда выходит за пределы ограничений, особенно при представлении чисел со знаком и абстрактных чисел, таких как числа с плавающей запятой) *
Просто используйте стандартные типы и ограничения, как указано в stdint.h
и limits.h
, или старайтесь не сдвигать пределы все вместе.