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)
是正确的表达?
答案 0 :(得分:2)
(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
的大小不同
在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] |
* +=============================+
*/