(size_t)(uint32_t) - (int32_t)(nTableMask)的含义

时间:2018-05-01 14:46:56

标签: php c casting type-conversion

PHP是由C编写的,当我阅读源代码时,我发现了一个奇怪的宏扩展,如下所示。

(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 :(得分:2)

(size_t)(uint32_t)-(int32_t)(-8)

首先是(int32_t)(-8)0xFFFFFFF8

然后是(uint32_t)- -8(uint32_t)80x00000008

最后(size_t) 8 size_t可能与uint32_t的大小不同

在64位系统上它将是0x0000000000000008

答案 1 :(得分:1)

代码:(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]    |
 *                 +=============================+
 */