如果在我的机器上 sizeof(long) == sizeof(long long),为什么它们不是同一类型?
If on my machine sizeof(long) == sizeof(long long), why aren't they the same type?
如果我运行:
#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;
}
在我的机器上(和 Coliru 上),我 get:
sizeof(long) = 8
sizeof(long long) = 8
std::is_same<long, long long>::value = false
而且不仅仅是 std::is_same<>
;期望实例化 int64_t
的翻译单元失败,因为我只在另一个翻译单元中为 int
和 long long int
编译,尽管它们都发生在同一台机器上。
为什么这些类型不一样?我的意思是,表现出与 typedef
相同类型的行为相同的行为?
这是语言规则,对可移植性至关重要。
int
、long
和 long long
都被语言视为不同的类型,即使它们具有相同的字节数和补码方案。
这是故意的。这意味着您可以编写可以在类型大小不同的不同平台上编译的代码。
举个例子,两个重载会很烦人
void foo(int f)
和
void foo(long f)
在一个平台上被视为相同的功能,在另一个平台上被视为不同的重载。
同样,这个程序:
#include <type_traits>
#include <iostream>
int main()
{
using ::std::cout;
using ::std::is_same;
using ::std::boolalpha;
cout << "sizeof(long) = " << sizeof(long) << "\n";
cout << "sizeof(long long) = " << sizeof(long long) << "\n";
cout << "sizeof(double) = " << sizeof(double) << "\n";
cout << "::std::is_same<long, long long>::value = "
<< boolalpha << is_same<long, long long>::value
<< "\n";
std::cout << "::std::is_same<long, double>::value = "
<< boolalpha << is_same<long, double>::value
<< "\n";
return 0;
}
输出这个:
sizeof(long) = 8
sizeof(long long) = 8
sizeof(double) = 8
::std::is_same<long, long long>::value = false
::std::is_same<long, double>::value = false
如您所见,double
和 long
看起来长度相同,为什么它们不是相同类型的 typedef?
如果我运行:
#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;
}
在我的机器上(和 Coliru 上),我 get:
sizeof(long) = 8
sizeof(long long) = 8
std::is_same<long, long long>::value = false
而且不仅仅是 std::is_same<>
;期望实例化 int64_t
的翻译单元失败,因为我只在另一个翻译单元中为 int
和 long long int
编译,尽管它们都发生在同一台机器上。
为什么这些类型不一样?我的意思是,表现出与 typedef
相同类型的行为相同的行为?
这是语言规则,对可移植性至关重要。
int
、long
和 long long
都被语言视为不同的类型,即使它们具有相同的字节数和补码方案。
这是故意的。这意味着您可以编写可以在类型大小不同的不同平台上编译的代码。
举个例子,两个重载会很烦人
void foo(int f)
和
void foo(long f)
在一个平台上被视为相同的功能,在另一个平台上被视为不同的重载。
同样,这个程序:
#include <type_traits>
#include <iostream>
int main()
{
using ::std::cout;
using ::std::is_same;
using ::std::boolalpha;
cout << "sizeof(long) = " << sizeof(long) << "\n";
cout << "sizeof(long long) = " << sizeof(long long) << "\n";
cout << "sizeof(double) = " << sizeof(double) << "\n";
cout << "::std::is_same<long, long long>::value = "
<< boolalpha << is_same<long, long long>::value
<< "\n";
std::cout << "::std::is_same<long, double>::value = "
<< boolalpha << is_same<long, double>::value
<< "\n";
return 0;
}
输出这个:
sizeof(long) = 8
sizeof(long long) = 8
sizeof(double) = 8
::std::is_same<long, long long>::value = false
::std::is_same<long, double>::value = false
如您所见,double
和 long
看起来长度相同,为什么它们不是相同类型的 typedef?