首页 > 解决方案 > 将 unsigned int 的最大值转换为 int 并期望结果为-1 是否可移植?

问题描述

我发现了一个 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.
}

标签: c++implicit-conversionunsigned

解决方案


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

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

  • 实现定义(C++20 前)

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


推荐阅读