Как обнаружить кодировки на подписанных целых числах в C?
-
26-09-2019 - |
Вопрос
Стандарт ISO C позволяет три метода кодирования для подписанных целых чисел: дополнение двух, дополнением и подписи / величины.
Какой эффективный или хороший способ обнаружить кодировку во время выполнения (или в другое время, если есть лучшее решение)? Я хочу знать это, поэтому я могу оптимизировать библиотеку Bignum для разных возможностей.
Я планирую вычислить это и хранить его в переменной каждый раз, когда программа работает так, чтобы она не должна была быть ослепительно быстрой - я предполагаю, что кодировка не изменится во время выполнения программы :-)
Решение
Вы просто должны проверить биты низкого порядка константы -1
с чем-то вроде -1 & 3
. Отказ Это оценивает
- для знака и величины,
- для своего дополнения и
- для дополнения двух.
Это должно быть даже возможно сделать в препроцессоре выражении внутри #if #else
конструкции.
Другие советы
Обнаружение своего дополнения должно быть довольно просто - что-то вроде if (-x == ~x)
. Отказ Обнаружение дополнительного комплемента должно быть почти так же легко: if (-x == ~x + 1)
. Отказ Если это ни один из них, то он должен быть подписать / величину.
Почему бы не сделать это в компиляционном времени? У вас могут быть программа «Создание сценариев сборки» / Makefile. Это также означает производительность много менее важно, потому что он работает только один раз в компиляцию, а не раз за пробежку.
Получите указатель на INT, который показал бы отличительный битовый шаблон. Отбрасывайте его как указатель на unsigned int, а затем осмотрите битные значения.
Делать это с парой тщательно выбранных ценностей должна делать то, что вы хотите.
Я думаю, вы храните отрицательный номер как int
в а char
Массив достаточно большой, чтобы держать его и сравнить массив с различными представлениями, чтобы узнать.
Но UHM ... unsigned целые числа не должны иметь знак, делают ли они?