uintptr_t uint_to_uintptr(unsigned int n) {
return (uintptr_t)n;
}
uintptr_t ulint_to_uintptr(unsigned long int n) {
return (uintptr_t)n;
}
uintptr_t ullint_to_uintptr(unsigned long long int n) {
return (uintptr_t)n;
}
上面 3 种类型转换中哪一种不会导致信息(位)丢失?
c99标准说:
以下类型指定无符号整数类型,其属性是任何指向
的有效指针都可以转换为该类型,然后转换回指向void
的指针,结果将与原始指针进行比较:void
uintptr_t
但它没有指定这个
unsigned integer type
的大小是多少。
它是指最大宽度无符号整数类型(
UINTMAX_MAX
)的最大值还是简单的unsigned int
?
我可以将
投射到unsigned long int
中吗?uintptr_t
代码可以总是将无符号类型转换为另一种无符号类型。 演员阵容平息了可能发生的警告。
如果目标类型是子范围,信息可能会丢失。
这样就好了。
uintptr_t ullint_to_uintptr(unsigned long long int n) {
return (uintptr_t)n;
}
但是需要演员阵容吗? 也许不是。 代码可以使用
#if
来确定。
uintptr_t ullint_to_uintptr(unsigned long long int n) {
// C allows this to be true as pointer size, and hence `intptr_t` is not in a tight relationship with `unsigned long long`.
#if UINTPTR_MAX < ULLONG_MAX
return (uintptr_t) n;
#else
return n;
#endif
}