我是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
吗?
long
是,它是不是更短的比int
。
Answers:
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>
或中<cinttypes>
(在namespace下std
)或在<stdint.h>
或中<inttypes.h>
(在全局名称空间中)声明它。
int64_t
保证使用2的补码表示法并且没有填充位,并且是可选的(尽管如果实现的标准类型符合要求,则必须存在)。long int
既不保证也不保证总是存在。当C ++ 11标准在18.4中引用“ C标准”时,表示C99。
int64_t
over long int
,反之亦然?
long int
可能只有32位。因此,如果您要存储大于20亿的数字,并且必须在这两者之间进行选择,那么显然要选择int64_t
。反之亦然,这比较棘手,因为long int
没有太多令人信服的有保证的特性int64_t
。但是,它保证存在,但事实int64_t
并非如此。而且,当您进行非便携式书写并知道尺寸时,如果long int
想要的尺寸是,请使用它并继续您的生活。
从当前实施的观点出发,针对k8(x86_64)架构上的SWIG用户,我的费用为2美分。
首先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
参考: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
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
首先
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
但控制typedef ...
现在不好了: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
又名long int
将long
在Linux上绑定到Java / C#...
long long
,long int
是不同的类型,但是sizeof(long long) == sizeof(long int) == sizeof(int64_t)
哦?尝试使用-m32
....
sizeof(long) == 4