我是 C/C++ 新手,所以我有几个关于基本类型的问题:
a) 你能解释一下int64_t
和long
( long int
) 之间的区别吗?据我了解,两者都是 64 位整数。有什么理由选择一个而不是另一个吗?
b) 我试图在网上查找 的定义int64_t
,但没有成功。有没有我需要咨询这些问题的权威来源?
c)对于int64_t
用于编译的代码,我目前包括<iostream>
,这对我来说没有多大意义。是否还有其他提供声明的包含int64_t
?
我是 C/C++ 新手,所以我有几个关于基本类型的问题:
a) 你能解释一下int64_t
和long
( long int
) 之间的区别吗?据我了解,两者都是 64 位整数。有什么理由选择一个而不是另一个吗?
b) 我试图在网上查找 的定义int64_t
,但没有成功。有没有我需要咨询这些问题的权威来源?
c)对于int64_t
用于编译的代码,我目前包括<iostream>
,这对我来说没有多大意义。是否还有其他提供声明的包含int64_t
?
a) 你能解释一下
int64_t
和long
(long int
) 之间的区别吗?据我了解,两者都是 64 位整数。有什么理由选择一个而不是另一个吗?
前者是有符号整数类型,正好是64 位。后者是至少32 位的有符号整数类型。
b) 我试图在网上查找 的定义
int64_t
,但没有成功。有没有我需要咨询这些问题的权威来源?
http://cppreference.com在这里介绍:http ://en.cppreference.com/w/cpp/types/integer 。然而,权威来源是C++ 标准(这个特定的位可以在 §18.4 整数类型 [cstdint] 中找到)。
c) 对于
int64_t
用于编译的代码,我包括<iostream>
,这对我来说没有多大意义。是否还有其他提供声明的包含int64_t
?
它在<cstdint>
or中<cinttypes>
(在命名空间下std
)或在<stdint.h>
or中<inttypes.h>
(在全局命名空间中)声明。
int64_t
C99 标准保证在实现它的平台上正好是64 位宽,对于long
至少 32 位的 a 没有这样的保证,所以它可能更多。
§7.18.1.3 精确宽度整数类型 1 typedef 名称 intN_t 指定宽度为 N 、无填充位和二进制补码表示的有符号整数类型。因此,int8_t 表示宽度正好为 8 位的有符号整数类型。
int64_t
typedef
你能<stdint.h>
在C中找到吗
int64_t 在任何平台上都应该是 64 位宽(因此得名),而 long 在不同平台上可以有不同的长度。特别是,sizeof(long) 通常为 4,即。32 位。
我的 2 美分,从当前实现的观点和 k8 (x86_64) 架构上的 SWIG 用户。
首先long long
和long int
是不同的类型,但是sizeof(long long) == sizeof(long int) == sizeof(int64_t)
首先尝试查找编译器在哪里以及如何定义 int64_t 和 uint64_t
grepc -rn "typedef.*INT64_TYPE" /lib/gcc
/lib/gcc/x86_64-linux-gnu/9/include/stdint-gcc.h:43:typedef __INT64_TYPE__ int64_t;
/lib/gcc/x86_64-linux-gnu/9/include/stdint-gcc.h:55:typedef __UINT64_TYPE__ uint64_t;
所以我们需要找到这个编译器宏定义
gcc -dM -E -x c /dev/null | grep __INT64
#define __INT64_C(c) c ## L
#define __INT64_MAX__ 0x7fffffffffffffffL
#define __INT64_TYPE__ long int
gcc -dM -E -x c++ /dev/null | grep __INT64
#define __INT64_C(c) c ## L
#define __INT64_MAX__ 0x7fffffffffffffffL
#define __INT64_TYPE__ long int
clang -dM -E -x c++ /dev/null | grep INT64_TYPE
#define __INT64_TYPE__ long int
#define __UINT64_TYPE__ long unsigned int
Clang,GNU 编译器:
-dM
转储宏列表。
-E
将结果打印到标准输出而不是文件。
-x c
并-x c++
在使用没有文件扩展名的文件时选择编程语言,例如/dev/null
注意:对于 swig 用户,在 Linux x86_64 上使用-DSWIGWORDSIZE64
在 Catalina 10.15 IIRC 上
clang -dM -E -x c++ /dev/null | grep INT64_TYPE
#define __INT64_TYPE__ long long int
#define __UINT64_TYPE__ long long unsigned int
Clang:
-dM
转储宏列表。
-E
将结果打印到标准输出而不是文件。
-x c
并-x c++
在使用没有文件扩展名的文件时选择编程语言,例如/dev/null
注意:对于 swig 用户,在 macOS x86_64上不要使用-DSWIGWORDSIZE64
首先
sizeof(long int) == 4
和sizeof(long long) == 8
在stdint.h
我们有:
#if _VCRT_COMPILER_PREPROCESSOR
typedef signed char int8_t;
typedef short int16_t;
typedef int int32_t;
typedef long long int64_t;
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
typedef unsigned long long uint64_t;
注意:对于 swig 用户,在 windows x86_64上不要使用-DSWIGWORDSIZE64
首先查看 https://github.com/swig/swig/blob/3a329566f8ae6210a610012ecd60f6455229fe77/Lib/stdint.i#L20-L24以便您可以使用SWIGWORDSIZE64
但...
现在不好了:SWIG Java和SWIG CSHARP不考虑它
所以你可能想使用
#if defined(SWIGJAVA)
#if defined(SWIGWORDSIZE64)
%define PRIMITIVE_TYPEMAP(NEW_TYPE, TYPE)
%clear NEW_TYPE;
%clear NEW_TYPE *;
%clear NEW_TYPE &;
%clear const NEW_TYPE &;
%apply TYPE { NEW_TYPE };
%apply TYPE * { NEW_TYPE * };
%apply TYPE & { NEW_TYPE & };
%apply const TYPE & { const NEW_TYPE & };
%enddef // PRIMITIVE_TYPEMAP
PRIMITIVE_TYPEMAP(long int, long long);
PRIMITIVE_TYPEMAP(unsigned long int, long long);
#undef PRIMITIVE_TYPEMAP
#endif // defined(SWIGWORDSIZE64)
#endif // defined(SWIGJAVA)
和
#if defined(SWIGCSHARP)
#if defined(SWIGWORDSIZE64)
%define PRIMITIVE_TYPEMAP(NEW_TYPE, TYPE)
%clear NEW_TYPE;
%clear NEW_TYPE *;
%clear NEW_TYPE &;
%clear const NEW_TYPE &;
%apply TYPE { NEW_TYPE };
%apply TYPE * { NEW_TYPE * };
%apply TYPE & { NEW_TYPE & };
%apply const TYPE & { const NEW_TYPE & };
%enddef // PRIMITIVE_TYPEMAP
PRIMITIVE_TYPEMAP(long int, long long);
PRIMITIVE_TYPEMAP(unsigned long int, unsigned long long);
#undef PRIMITIVE_TYPEMAP
#endif // defined(SWIGWORDSIZE64)
#endif // defined(SWIGCSHARP)
所以int64_t
akalong int
将绑定到long
Linux 上的 Java/C#...