Как определить кодировки целых чисел со знаком в C?
Стандарт ISO C допускает три метода кодирования для целых чисел со знаком: два дополнения, одно дополнение и знак/значение.
Какой эффективный или хороший способ обнаружить кодировку во время выполнения (или в другое время, если есть лучшее решение)? Я хочу знать это, поэтому я могу оптимизировать библиотеку bignum для различных возможностей.
Я планирую вычислять это и хранить его в переменной каждый раз, когда программа запускается, поэтому она не должна быть ослепительно быстрой - я предполагаю, что при запуске программы кодировка не изменится: -)
Ответы
Ответ 1
Вам просто нужно проверить бит нижнего порядка константы -1
с чем-то вроде -1 & 3
. Это оценивается как
- для знака и величины,
- для одного дополнения и
- для двух дополнений.
Это должно быть даже возможно сделать в выражении препроцессора внутри конструкций #if #else
.
Ответ 2
Обнаружение одного дополнения должно быть довольно простым - что-то вроде if (-x == ~x)
. Обнаружение двух дополнений должно быть примерно таким же простым: if (-x == ~x + 1)
. Если это ни один из них, то это должен быть знак/величина.
Ответ 3
Почему бы не сделать это во время компиляции? Вы могли бы, если скрипты сборки /makefile скомпилировать тестовую программу, если необходимо, но затем используйте препроцессор для выполнения условной компиляции. Это также означает, что производительность гораздо менее важна, поскольку она выполняется только один раз для компиляции, а не один раз за запуск.
Ответ 4
Получить указатель на int, который будет показывать отличительный бит-шаблон. Передайте его как указатель на unsigned int, а затем просмотрите значения бит.
Выполнение этого с помощью пары тщательно выбранных значений должно делать то, что вы хотите.
Ответ 5
Я думаю, вы сохранили бы отрицательное число как int
в массив char
, достаточно большой, чтобы его удержать и сравнить массив с различными представлениями, чтобы узнать.
Но числа без знака ohm... не должны иметь знак, не так ли?