如果在我的机器上sizeof(long)== sizeof(long long),为什么它们不是同一类型?

ein*_*ica 0 c++ 64-bit types int64 long-long

如果我跑:

#include <type_traits>
#include <iostream>

int main()
{
    std::cout << "sizeof(long) = " << sizeof(long) << "\n";
    std::cout << "sizeof(long long) = " << sizeof(long long) << "\n";
    std::cout << "std::is_same<long, long long>::value = " 
        << std::boolalpha << std::is_same<long, long long>::value 
        << "\n";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在我的机器上(和Coliru),我得到:

sizeof(long) = 8
sizeof(long long) = 8
std::is_same<long, long long>::value = false
Run Code Online (Sandbox Code Playgroud)

它不仅仅是std::is_same<>; 翻译单元期待的一个实例int64_t失败,因为我只编译intlong long int在另一个翻译单元,尽管这一切发生在同一台机器上.

为什么这些类型不一样?我的意思是,表现出你所拥有typedef的相同类型的行为?

Bat*_*eba 7

这是语言规则,对于可移植性至关重要.

int,longlong long,都被语言视为不同的类型,即使它们具有相同的字节数和补充方案.

这是故意的.这意味着您可以编写可以在类型大小不同的不同平台上编译的代码.

如果说两个超载,那将是非常烦人的

void foo(int f)
Run Code Online (Sandbox Code Playgroud)

void foo(long f)
Run Code Online (Sandbox Code Playgroud)

在一个平台上被视为相同的功能,在另一个平台上被视为不同的重载.

  • @einpoklum如果它们是相同的类型,写两个重载将违反一个定义规则(因为实际上它将是一个以两种不同的方式写入的重载).这将导致某些平台上的编译错误,而不会导致其他平台上的编译错误.这在任何方面都是不可接受的. (2认同)
  • @einpoklum:我不确定这是否相关.固定宽度签名类型都需要2的补码.我所说的内置类型可以是1的补码,2的补码或有符号的幅度.C++旨在针对异国情调的架构. (2认同)