Дешифровка странного предупреждения компилятора о неподписанной десятичной константе

Это крупное приложение имеет библиотеку пула памяти, которая использует treap внутренне для хранения узлов памяти. treap реализован с помощью cpp макросы, и полный файл trp.h может быть найден здесь. Я получаю следующее предупреждение компилятора, когда я пытаюсь скомпилировать приложение:

warning: this decimal constant is unsigned only in ISO C90

Путем удаления частей макро-кода и использования эмпирический, я наконец нашел преступника:

#define trp_prio_get(a_type, a_field, a_node)               \
    (2654435761*(uint32_t)(uintptr_t)(a_node))

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

Править: Я использую gcc-4.1

5
задан artagnon 24 May 2010 в 17:59
поделиться

4 ответа

Попробуйте заменить это число на

2654435761u

, чтобы заставить его беззнаковый.

6
ответ дан 18 December 2019 в 10:42
поделиться

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

2
ответ дан 18 December 2019 в 10:42
поделиться

2654435761 - это число золотого сечения, соответствующее 2 ^ 32.

В книге Кнута «Искусство компьютера» Программирование », раздел 6.4, а мультипликативная схема хеширования введен как способ записи хэша функция. Ключ умножается на золотое сечение 2 ^ 32 (2654435761) к произвести хэш-результат.

Поскольку 2654435761 и 2 ^ 32 не имеют общие факторы общие, умножение дает полный отображение ключа в результат хеширования с помощью нет перекрытия. Этот метод отлично работает хорошо, если ключи имеют небольшие значения. Плохие результаты хеширования выдаются, если ключи различаются по старшим битам. Как есть верно во всех умножениях, вариации старших цифр не влиять на нижние цифры результат умножения.

http://www.concentric.net/~Ttwang/tech/inthash.htm

6
ответ дан 18 December 2019 в 10:42
поделиться

Проблема в том, что эта константа 2654435761 больше 2 ^ 31. Это означает, что в старых компиляторах оно фактически превратится в отрицательное значение как константу со знаком.

В данном случае это не имеет значения, так как из-за умножения на беззнаковое значение оно будет преобразовано обратно в беззнаковое, и все произойдет правильно.

2
ответ дан 18 December 2019 в 10:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: