在通常的算术转换中,无符号整数和有符号整数运算的结果在不同的编译器上是不同的

问题描述 投票:0回答:1
#include <typeinfo>
#include <cassert>
#include <iostream>

int main()
{
    assert(typeid(1L + 1U) == typeid(long));
    std::cout << typeid(1L + 1U).name();
}

我在windows上使用clion内置的mingw或者Visual Studio内置的msvc或clang。运行结果是unsigned long,但是在linux的clang或者gcc上,运行结果是long。

如何获得windows上long的结果?

c++ gcc visual-c++ clang mingw
1个回答
0
投票

您观察到的行为差异可能是由于不同平台上

long
unsigned long
的大小造成的。在 Windows 上,long 的大小通常为 4 字节(32 位),而在许多 Linux 系统上,它为 8 字节(64 位)。这种大小差异会影响表达式
1L + 1U
的结果。

为了确保不同平台上的行为一致,您可以使用显式类型转换来指定所需的类型。在您的情况下,如果您希望结果为 long 类型,则可以显式转换结果。这是一个例子:

#include <typeinfo>
#include <cassert>
#include <iostream>

int main()
{
    // Use explicit type casting to ensure consistent behavior
    long result = static_cast<long>(1L + 1U);
    
    assert(typeid(result) == typeid(long));
    std::cout << typeid(result).name();
}

这样,您就可以将表达式

1L + 1U
的结果显式转换为
long
,确保类型在不同平台上保持一致。

请记住,如果值超出 long 范围,则显式转换结果可能会导致信息丢失。确保您的代码逻辑可以正确处理此类情况。

© www.soinside.com 2019 - 2024. All rights reserved.