将 unsigned int 的最大值转换为 int 并期望结果为 -1 是否可移植?

Flo*_*oFu 2 c++ unsigned implicit-conversion

我找到了一个 C++ 代码,我们将初始化为最大值的 unsigned int 32 转换为有符号 int 并期望它是-1. 它在经过测试的编译器上运行良好,但它真的可移植吗?

int GetBusinessDataID()
{
    u32_t id = ~0;

    // Some code that may return a valid ID.

    return id; // Here we expect to return -1.
}
Run Code Online (Sandbox Code Playgroud)

son*_*yao 5

从 C++20 开始,这对于整数转换是有保证的;在 C++20 之前,这是实现定义的。

如果目标类型是有符号的,并且源整数可以在目标类型中表示,则该值不会更改。否则结果是

  • 实现定义(直到 C++20)

  • 目标类型的唯一值等于源值模 2 n ,其中n是用于表示目标类型的位数。(从 C++20 开始)。