我在电脑上试过这个
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位,它显示long
与int64_t
相同,但long long
与int64_t
不同,它也是64位。为什么会发生这种情况?
修改
我可以在我的机器上互换使用long long
和int64_t
,因为它们都是整数类型且大小相同吗?
答案 0 :(得分:8)
long
和long long
是由核心语言定义的内置类型。
int64_t
由<cstdint>
标头定义(实际上包括<stdint.h>
)。它被定义为某些内置类型的别名。在您的情况下,它被定义为long
的别名。
在某些平台上可以大小相同的内置类型仍然需要被视为不同的类型,以免创建过载函数的模糊调用。
甚至内置的数字类型保证具有相同的大小和符号,但仍然是不同的。也就是说,unsigned char
,char
和signed char
的所有三个都是不同的,大小为1,但char
必须与其他一个签名相同。虽然我不建议这样做,但从技术上讲,你可以根据这种差异自由地重载功能。
RE
“我可以在我的机器上互换使用
long long
和int64_t
,因为它们都是整数类型并且大小相同吗?
这取决于你所说的“可互换”。
由于int64_t
与您的编译器是long
的别名,因此您无法调用期望int64_t*
的函数,并使用long long*
指针。
但long long
保证至少为64位,从这个意义上说,只有在可读性方面才重要,因为您选择了long long
和int64_t
中的哪一个
答案 1 :(得分:0)
有五种标准的有符号整数类型:“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} ;,可互换地使用这些类型仍然需要类型转换