英语轻松读发新版了,欢迎下载、更新

求助一个C语法问题,C语言的数据类型名本身当作数据来加减?

spike13 发布于 2016年11月12日 | 更新于 2016年11月12日
tinyfool 等1人欣赏。
#define HT_INVALID_IDX ((uint32_t) -1)
#define HT_HASH_SIZE(nTableMask) 
    (((size_t)(uint32_t)-(int32_t)(nTableMask)) * sizeof(uint32_t))

最近在看php7源码,发现有的地方直接用数据类型加减 ,问下有人知道什么意思吗? ((uint32_t) -2) 结果是 4294967294,也就是 2^32-2 。 目测是指 这个类型所能表示的最大值。 但想要一个确定的语法说明。

哪位大神知道,麻烦说明一下,感谢感谢。

共1条回复
pinxue 回复于 2016年11月12日

只是强制类型转换,利用了负数的二进制表示方式。

比如,-1 在32位下

原码为: 10000000 00000000 00000000 00000001

反码为 11111111 11111111 11111111 11111110

补码为 11111111 11111111 11111111 11111111

所 (uint32_t)-1) 其实就是 0xFFFFFFFF。

HASH SIZE是三步:

n = (int32_t)(nTableMask)

a = ((sizet)(uint32t) (-n)

SIZE = a * sizeof(uint32_t))

登录 或者 注册