为什么long long不是int64_t但它们有相同的大小?

时间:2017-01-04 02:23:48

标签: c++ typetraits

我在电脑上试过这个

std::cout << std::is_same<int64_t, long long>::value;
std::cout << std::is_same<int64_t,  long>::value;
std::cout << sizeof(long);
std::cout << sizeof(long long);
std::cout << sizeof(int64_t);

,结果为false, true, 8, 8, 8

我知道int64_t正好是64位,它显示longint64_t相同,但long longint64_t不同,它也是64位。为什么会发生这种情况?

修改

我可以在我的机器上互换使用long longint64_t,因为它们都是整数类型且大小相同吗?

2 个答案:

答案 0 :(得分:8)

longlong long是由核心语言定义的内置类型。

int64_t<cstdint>标头定义(实际上包括<stdint.h>)。它被定义为某些内置类型的别名。在您的情况下,它被定义为long的别名。

在某些平台上可以大小相同的内置类型仍然需要被视为不同的类型,以免创建过载函数的模糊调用。

甚至内置的数字类型保证具有相同的大小和符号,但仍然是不同的。也就是说,unsigned charcharsigned char的所有三个都是不同的,大小为1,但char必须与其他一个签名相同。虽然我不建议这样做,但从技术上讲,你可以根据这种差异自由地重载功能。

RE

  

我可以在我的机器上互换使用long longint64_t,因为它们都是整数类型并且大小相同吗?

这取决于你所说的“可互换”。

由于int64_t与您的编译器是long的别名,因此您无法调用期望int64_t*的函数,并使用long long*指针。

long long保证至少为64位,从这个意义上说,只有在可读性方面才重要,因为您选择了long longint64_t中的哪一个

答案 1 :(得分:0)

3.9.1

  

有五种标准的有符号整数类型:“signed char”,“short”   int“,”int“,”long int“和”long long int&#34;

[18.4.1]同样说

  

使用int64_t =有符号整数类型; //可选

因此,您正在查看两种不同的基本类型,并将它们与类型别名进行比较。 在您的情况下,int64_t的别名为long但是当其long long int别名

时可能会有一个实现

至于你的额外问题,这取决于你的互换性是什么意思,long long至少与long一样长,但在理论上或将来可能会更长&#39} ;,可互换地使用这些类型仍然需要类型转换