int64_t的定义

时间:2012-11-28 11:35:14

标签: c++ c integer long-integer

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

a)你能解释一下int64_tlonglong int)之间的区别吗? 据我所知,两者都是64位整数。有没有理由选择其中一个?

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

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

5 个答案:

答案 0 :(得分:81)

  

a)你能解释一下int64_tlonglong int)之间的区别吗?据我所知,两者都是64位整数。有没有理由选择其中一个?

前者是带符号的整数类型,正好 64位。后者是带符号的整数类型,至少 32位。

  

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

http://cppreference.com在此处介绍了这一点:http://en.cppreference.com/w/cpp/types/integer。然而,权威来源是C++ standard(这个特定的位可以在§18.4整数类型[cstdint]中找到)。

  

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

它在<cstdint><cinttypes>(名称空间std下)或<stdint.h><inttypes.h>(在全局名称空间中)声明。

答案 1 :(得分:7)

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

  

§7.18.1.3精确宽度整数类型1 typedef名称intN_t   指定有符号整数类型,宽度为N,没有填充位,和   二进制补码表示。因此,int8_t表示签名   整数类型,宽度恰好为8位。

答案 2 :(得分:4)

int64_t typedef您可以在<stdint.h>中找到{<1}}

答案 3 :(得分:2)

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

答案 4 :(得分:1)

我的2美分, 从当前实施的角度出发,并针对k8(x86_64)架构上的SWIG用户。

Linux

long longlong int是不同的类型 但是sizeof(long long) == sizeof(long int) == sizeof(int64_t)

Gcc

首先尝试查找编译器在哪里以及如何定义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

C语

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

)时选择编程语言

参考: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

MacOS

在Catalina 10.15 IIRC上

C语

clang -dM -E -x c++ /dev/null | grep INT64_TYPE
#define __INT64_TYPE__ long long int
#define __UINT64_TYPE__ long long unsigned int

C语:
-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

Visual Studio 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;

注意:对于Swig用户,在Windows x86_64上请勿使用-DSWIGWORDSIZE64

SWIG材料

首先查看https://github.com/swig/swig/blob/3a329566f8ae6210a610012ecd60f6455229fe77/Lib/stdint.i#L20-L24,以便您可以使用SWIGWORDSIZE64控制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)

#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也称为long int将在Linux上绑定到Java / C#long ...