为何要先将指针转换为unsigned long再转换为uint32_t?
为何要先将指针转换为unsigned long再转换为uint32_t?
咱们先从futex系统调用的参数逻辑说起吧。Linux的futex手册页里,对第四个参数的解释有这么一段:
For several blocking operations, the timeout argument is a pointer to a timespec structure that specifies a timeout for the operation. However, notwithstanding the prototype shown above, for some operations, the least significant four bytes of this argument are instead used as a 32-bit integer value.
那为啥要多这一步,先把指针转成unsigned long再转成uint32_t呢?我给你掰扯得明明白白:
- 首先得明确,指针的大小是跟着系统架构走的——32位系统下指针是4字节,64位系统下是8字节。如果直接把指针转成
uint32_t,在64位系统里会直接砍掉高4字节,这可不是我们要的结果,我们要的是完整保留指针值后,只取它的低32位。 - 先转成
unsigned long就刚好解决这个问题:C标准里规定unsigned long的长度和当前系统的指针长度是一致的,能完整装下指针的所有位。先把指针转成unsigned long,相当于把指针的地址值完整转换成了同宽的整数,这时候再转成uint32_t,就精准拿到了这个值的低32位,完全符合futex某些操作对参数的要求。 - 还有个编译器层面的原因:直接把指针转成
uint32_t,很多编译器会弹出警告,因为不同宽度的指针和整数转换风险很高。但先转成unsigned long(和指针同宽的整数类型)是更合规的转换,编译器一般不会报错,也符合类型转换的安全规范。
内容来源于stack exchange
相关产品推荐
相关产品推荐

