Что означает (size_t) (uint32_t) - (int32_t) (nTableMask) - PullRequest
0 голосов
/ 01 мая 2018

PHP написан на C, когда я прочитал исходный код, я обнаружил незнакомое расширение Macro, как показано ниже.

(size_t)(uint32_t)-(int32_t)(nTableMask) // nTableMask=-8

Я использую GDB для печати (size_t)(uint32_t), это неправильно

(gdb) p (size_t)(uint32_t) A syntax error in expression, near `'.

но когда я меняю выражение, оно срабатывает

(gdb) p (size_t)(uint32_t)-(int32_t)(-8) $21 = 8

Моя проблема:

что означает (size_t)(uint32_t)-(int32_t)(-8)? Я знаю, (size_t)(uint32_t) неправильно, но почему (size_t)(uint32_t)-(int32_t)(-8) правильное выражение?

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

код: (size_t)(uint32_t)-(int32_t)(nTableMask) Это значит:

1. -(int32_t)(nTableMask) //Cast nTableMask to signed int32 and invert sign
2. (uint32_t) //cast value on step 1 to unsigned int32
3. (size_t) //cast value on step 2 to unsigned int64

Этот код используется для вычисления размера хеш-таблицы части arData (верхняя часть).

/ *

 * HashTable Data Layout
 * =====================
 *
 *                 +=============================+
 *                 | HT_HASH(ht, ht->nTableMask) |
 *                 | ...                         |
 *                 | HT_HASH(ht, -1)             |
 *                 +-----------------------------+
 * ht->arData ---> | Bucket[0]                   |
 *                 | ...                         |
 *                 | Bucket[ht->nTableSize-1]    |
 *                 +=============================+
 */
0 голосов
/ 01 мая 2018
(size_t)(uint32_t)-(int32_t)(-8)

является первым (int32_t)(-8) или 0xFFFFFFF8

тогда это (uint32_t)- -8 или (uint32_t)8 или 0x00000008

наконец, это (size_t) 8, поскольку size_t может иметь размер, отличный от uint32_t

это будет 0x0000000000000008 в 64-битной системе.

...