Как определить кодировки целых чисел со знаком в 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... не должны иметь знак, не так ли?