Как обнаружить кодировки на целых числах со знаком в C? - PullRequest
15 голосов
/ 29 сентября 2010

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

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

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

Ответы [ 5 ]

16 голосов
/ 29 сентября 2010

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

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

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

12 голосов
/ 29 сентября 2010

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

2 голосов
/ 29 сентября 2010

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

0 голосов
/ 29 сентября 2010

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

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

0 голосов
/ 29 сентября 2010

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

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

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