我可以将 unsigned long int 转换为 uintptr_t 而不丢失位吗?

问题描述 投票:0回答:1
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

c casting c99
1个回答
0
投票

我可以将

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
}
© www.soinside.com 2019 - 2024. All rights reserved.