首页 > 解决方案 > 哪些数值类型可以安全地转换为 intptr_t?

问题描述

uintptr_t并且intptr_t数字类型足够大以包含指针,我的问题是它们在向它们投射时如何与其他数字类型相关。具体来说,哪些类型(intlonglong longshortcharsize_t)不能NUM_TYPE被定义为使得下一个函数不会破坏n?

intptr_t cast_num(NUM_TYPE n){return (intptr_t) n;}

标签: cpointersinteger-overflow

解决方案


可选类型:

intptr_t范围至少为[-0x7FFF...0x7FFF]。

uintptr_t范围为 [0...至少0xFFFF]。


根据需要使用INTPTR_MIN, INTPTR_MAX, UINTPTR_MAXfrom<stdint.h>形成条件代码。

intptr_t cast_long(unsigned long n) {
  _Static_assert(UIINTPTR_MAX >= ULONG_MAX, "unsigned long too big"): 
  return (intptr_t) n;
}

注意:指向/来自的对象指针uintptr_t应该intptr_t通过void *. 函数指针可能太大。


推荐阅读