int64_t的定义

cls*_*udt 63 c c++ integer long-integer

我是C/C++的新手,所以我对基本类型有几个问题:

a)你能解释一下int64_tlong(long int)之间的区别吗?据我所知,两者都是64位整数.有没有理由选择一个而不是另一个?

b)我试图int64_t在网上查找定义,但没有取得多大成功.我是否需要咨询这些问题的权威来源?

c)对于使用int64_t编译的代码,我目前包括<iostream>,这对我来说没有多大意义.还有其他包含提供声明int64_t吗?

R. *_*des 83

a)你能解释一下int64_tlong(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><cinttypes>(在命名空间下std)或在<stdint.h><inttypes.h>(在全局命名空间中)声明.

  • 对于该标准的鉴赏家:保证int64_t使用2的补码表示并且没有填充位,并且是可选的(尽管如果实现的标准类型符合要求,则必须存在)。`long int`既不能保证也不总是存在。当C ++ 11标准在18.4中引用“ C标准”时,表示C99。 (2认同)
  • @SteveJessop 为什么有人会在“long int”上使用“int64_t”,反之亦然? (2认同)

iab*_*der 8

int64_t在实现它的平台上,C99标准保证正好是 64位宽,没有这样的保证long,至少32位,所以可能更多.

§7.18.1.3精确宽度整数类型1 typedef名称intN_t指定有符号整数类型,其宽度为N,无填充位和二进制补码表示.因此,int8_t表示具有正好8位宽度的有符号整数类型.


Omk*_*ant 7

int64_ttypedef,你可以发现,在<stdint.h>用C


Miz*_*zux 7

我的 2 美分,从当前实现的角度来看,适用于 k8 (x86_64) 架构上的 SWIG 用户。

Linux

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

所以我们需要找到这个编译器宏定义

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 __UINT64
#define __UINT64_C(c) c ## UL
#define __UINT64_MAX__ 0xffffffffffffffffUL
#define __UINT64_TYPE__ long unsigned int
Run Code Online (Sandbox Code Playgroud)

clang -dM -E -x c++ /dev/null | grep INT64_TYPE
#define __INT64_TYPE__ long int
#define __UINT64_TYPE__ long unsigned int
Run Code Online (Sandbox Code Playgroud)

Clang、GNU 编译器:
-dM转储宏列表。
-E将结果打印到标准输出而不是文件。
-x c-x c++在使用没有文件扩展名的文件时选择编程语言,例如/dev/null

参考: https: //web.archive.org/web/20190803041507/http ://nadeausoftware.com/articles/2011/12/c_c_tip_how_list_compiler_predefined_macros

注意:对于 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
Run Code Online (Sandbox Code Playgroud)

Clang:
-dM转储宏列表。
-E将结果打印到标准输出而不是文件。
-x c-x c++在使用没有文件扩展名的文件时选择编程语言,例如/dev/null

参考: https: //web.archive.org/web/20190803041507/http ://nadeausoftware.com/articles/2011/12/c_c_tip_how_list_compiler_predefined_macros

注意:对于 swig 用户,在 macOS x86_64 上不要使用-DSWIGWORDSIZE64

视觉工作室 2019

首先 sizeof(long int) == 4sizeof(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;
Run Code Online (Sandbox Code Playgroud)

注意:对于 swig 用户,在 Windows x86_64 上不要使用-DSWIGWORDSIZE64

斯威格的东西

首先参见 https://github.com/swig/swig/blob/3a329566f8ae6210a610012ecd60f6455229fe77/Lib/stdint.i#L20-L24SWIGWORDSIZE64 ,这样你就可以使用以下命令控制typedef :

现在不好的是:SWIG JavaSWIG 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)
Run Code Online (Sandbox Code Playgroud)

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

所以int64_t又名long int将绑定到longLinux 上的 Java/C#...


Kyl*_*tan 5

int64_t 在任何平台上都应该是 64 位宽(因此得名),而 long 在不同平台上可以有不同的长度。特别是,sizeof(long) 通常为 4,即。32 位。