Как определить кодировки целых чисел со знаком в C?

Стандарт ISO C допускает три метода кодирования целых чисел со знаком: два дополнения, одно дополнение и знак / величина.

Какой эффективный или хороший способ обнаружить кодировку во время выполнения (или в другое время, если есть лучшее решение)? Я хочу знать это, чтобы я мог оптимизировать библиотеку bignum для различных возможностей.

Я планирую рассчитать это и сохранять его в переменной каждый раз, когда программа запускается, поэтому она не должна быть ослепительно быстрой - я предполагаю, что кодировка не изменится во время выполнения программы:-)

5 ответов

Решение

Вы просто должны проверить младшие биты константы -1 с чем-то вроде -1 & 3, Это оценивает

  1. для знака и величины,
  2. за свой счет и
  3. за два дополнения.

Это должно быть даже возможно сделать в выражении препроцессора внутри #if #else строит.

Обнаружение своего дополнения должно быть довольно простым - что-то вроде if (-x == ~x), Обнаружение дополнения двух должно быть примерно таким же простым: if (-x == ~x + 1), Если это ни один из них, то это должен быть знак / величина.

Почему бы не сделать это во время компиляции? Вы можете иметь сценарии сборки /makefile для компиляции тестовой программы, если это необходимо, но затем использовать препроцессор для условной компиляции. Это также означает, что производительность гораздо менее важна, потому что она запускается только один раз за компиляцию, а не один раз за запуск.

Получите указатель на int, который показал бы отличительный битовый образец. Приведите его в качестве указателя на unsigned int и затем проверьте значения битов.

Делать это с парой тщательно выбранных значений должно делать то, что вы хотите.

Я думаю, что вы бы хранить отрицательное число как int в char массив достаточно большой, чтобы вместить его и сравнить массив с различными представлениями, чтобы выяснить это.

Но хм... у целых чисел без знака не должно быть знака, не так ли?

Другие вопросы по тегам