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

StackOverflow https://stackoverflow.com/questions/3819250

Вопрос

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

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

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

Это было полезно?

Решение

Вы просто должны проверить биты низкого порядка константы -1 с чем-то вроде -1 & 3. Отказ Это оценивает

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

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

Другие советы

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

Почему бы не сделать это в компиляционном времени? У вас могут быть программа «Создание сценариев сборки» / Makefile. Это также означает производительность много менее важно, потому что он работает только один раз в компиляцию, а не раз за пробежку.

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

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

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

Но UHM ... unsigned целые числа не должны иметь знак, делают ли они?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top