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

bbv*_*van 3 c++ type-traits

我在电脑上试过这个

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);
Run Code Online (Sandbox Code Playgroud)

结果是 false, true, 8, 8, 8

我知道int64_t正好是64位,它显示的long是相同的int64_t,但long long不同于int64_t它,它也是64位.为什么会这样?

编辑

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

Che*_*Alf 8

long并且long long是由核心语言定义的内置类型.

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


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

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


回覆

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

这取决于你所说的"可互换".

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

但是long long保证至少是64位,从这个意义上来说,只有在可读性方面才重要,你选择哪个long longint64_t哪个.