哪些数字类型可以安全地转换为 intptr_t?
Which numerical types can be safely casted to intptr_t?
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;
}
注意:对象指针to/fromuintptr_t
和intptr_t
应该通过void *
转换。函数指针可能太大了。
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;
}
注意:对象指针to/fromuintptr_t
和intptr_t
应该通过void *
转换。函数指针可能太大了。