uintptr_t
和intptr_t
是足够大的数值类型,可以包含指针,我的问题是它们在投射到它们时与其他数值类型有何关系。具体来说,哪些类型(int
、long
、long long
、short
、char
、size_t
等(不能NUM_TYPE
定义为下一个函数不会破坏n
的值?
intptr_t cast_num(NUM_TYPE n){return (intptr_t) n;}
可选类型:
intptr_t
的范围至少为 [-0x7FFF...0x7FFF]。
uintptr_t
的范围为 [0...至少0xFFFF]。
根据需要使用<stdint.h>
中的INTPTR_MIN, INTPTR_MAX, UINTPTR_MAX
来形成条件代码。
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 *
进行转换。 函数指针可能太大。