int和long在C ++中有什么区别?

纠正我,如果我错了,

int是4个字节,范围从-2,147,483,648到2,147,483,647(2 ^ 31)
长度是4个字节,范围从-2,147,483,648到2,147,483,647(2 ^ 31)

C ++有什么区别? 它们可以互换使用吗?

它依赖于实现。

例如,在Windows下它们是相同的,但是例如在Alpha系统上,长度是64位,而int是32位。 本文介绍了可变平台上的英特尔C ++编译器规则。 总结:

  OS arch size Windows IA-32 4 bytes Windows Intel 64 4 bytes Windows IA-64 4 bytes Linux IA-32 4 bytes Linux Intel 64 8 bytes Linux IA-64 8 bytes Mac OS X IA-32 4 bytes Mac OS X Intel 64 8 bytes 

唯一的保证是:

 sizeof(char) == 1 sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long) // FROM @KTC. The C++ standard also has: sizeof(signed char) == 1 sizeof(unsigned char) == 1 // NOTE: These size are not specified explicitly in the standard. // They are implied by the minimum/maximum values that MUST be supported // for the type. These limits are defined in limits.h sizeof(short) * CHAR_BIT >= 16 sizeof(int) * CHAR_BIT >= 16 sizeof(long) * CHAR_BIT >= 32 sizeof(long long) * CHAR_BIT >= 64 CHAR_BIT >= 8 // Number of bits in a byte 

另见: long保证至less32位?

编译x64时,int和long之间的差别在0到4个字节之间,具体取决于您使用的编译器。

GCC使用LP64模型,这意味着在64位模式下,整数是32位,长整型是64位。

例如,MSVC使用LLP64模型,这意味着即使在64位模式下,整数和长整数也是32位。

C ++规范本身 (旧版本,但对此足够好)将此打开。

有四个有符号整数types:“ signed char ”,“ short int ”,“ int ”和“ long int ”。 在这个列表中,每个types至less提供了与列表中的前一个相同的存储空间。 Plain int具有执行环境*的体系结构所提出的自然大小;

[脚注:即,足够大以包含在头部<climits>定义的INT_MIN和INT_MAX范围内的任何值。 —结束foonote]

正如凯文·海恩斯(Kevin Haines)所指出的那样,整数具有执行环境所build议的自然大小,其必须适合于INT_MIN和INT_MAX。

C89标准规定UINT_MAX应至less为2 ^ 16-1, USHRT_MAX 2 ^ 16-1和ULONG_MAX 2 ^ 32-1。 这使得short和int的位数至less为16,长度为32。 对于char它明确指出它应该至less有8位( CHAR_BIT )。 C ++inheritance了limits.h文件的规则,所以在C ++中我们对这些值有相同的基本要求。 但是你不应该从int那里得到至less2个字节。 从理论上讲,char,int和long都可以是1个字节,在这种情况下, CHAR_BIT必须至less是32.只要记住“byte”总是char的大小,所以如果char更大,一个字节不仅是8位任何更多。

大多数情况下,字节的数量和值的范围是由CPU的体系结构决定的,而不是由C ++决定的。 然而,C ++设置了最低要求,litb正确地解释了,并且马丁·约克只犯了一些错误。

你不能长时间使用int和long的原因是因为它们并不总是一样的长度。 C是在PDP-11上发明的,其中一个字节有8位,int是两个字节,可以直接由硬件指令处理。 由于C程序员经常需要四字节算术,长期被发明,它是四个字节,由库函数处理。 其他机器有不同的规格。 C标准规定了一些最低要求。

依靠编译器供应商对原始types大小的实现,如果在另一个机器体系结构,操作系统或其他供应商的编译器上编译代码,将会再次困扰您。

大多数编译器供应商提供了一个头文件,它定义了具有明确types大小的基本types。 当代码可能被移植到另一个编译器时,应该使用这些基本types(在每个实例中总是这样读)。 例如,大多数UNIX编译器都有int8_t uint8_t int16_t int32_t uint32_t 。 微软有INT8 UINT8 INT16 UINT16 INT32 UINT32 。 我更喜欢Borland / CodeGear的int8 uint8 int16 uint16 int32 uint32 。 这些名字也提醒了一下预期值的大小/范围。

多年以来,我使用Borland的显式原始types名称和#include下面的C / C ++头文件(primitive.h),它旨在为任何C / C ++编译器定义具有这些名称的显式原语types(此头文件可能并不实际涵盖了每一个编译器,但它涵盖了我在Windows,UNIX和Linux上使用过的几个编译器,它还没有定义64位types)。

 #ifndef primitiveH #define primitiveH // Header file primitive.h // Primitive types // For C and/or C++ // This header file is intended to define a set of primitive types // that will always be the same number bytes on any operating operating systems // and/or for several popular C/C++ compiler vendors. // Currently the type definitions cover: // Windows (16 or 32 bit) // Linux // UNIX (HP/US, Solaris) // And the following compiler vendors // Microsoft, Borland/Imprise/CodeGear, SunStudio, HP/UX // (maybe GNU C/C++) // This does not currently include 64bit primitives. #define float64 double #define float32 float // Some old C++ compilers didn't have bool type // If your compiler does not have bool then add emulate_bool // to your command line -D option or defined macros. #ifdef emulate_bool # ifdef TVISION # define bool int # define true 1 # define false 0 # else # ifdef __BCPLUSPLUS__ //BC++ bool type not available until 5.0 # define BI_NO_BOOL # include <classlib/defs.h> # else # define bool int # define true 1 # define false 0 # endif # endif #endif #ifdef __BCPLUSPLUS__ # include <systypes.h> #else # ifdef unix # ifdef hpux # include <sys/_inttypes.h> # endif # ifdef sun # include <sys/int_types.h> # endif # ifdef linux # include <idna.h> # endif # define int8 int8_t # define uint8 uint8_t # define int16 int16_t # define int32 int32_t # define uint16 uint16_t # define uint32 uint32_t # else # ifdef _MSC_VER # include <BaseTSD.h> # define int8 INT8 # define uint8 UINT8 # define int16 INT16 # define int32 INT32 # define uint16 UINT16 # define uint32 UINT32 # else # ifndef OWL6 // OWL version 6 already defines these types # define int8 char # define uint8 unsigned char # ifdef __WIN32_ # define int16 short int # define int32 long # define uint16 unsigned short int # define uint32 unsigned long # else # define int16 int # define int32 long # define uint16 unsigned int # define uint32 unsigned long # endif # endif # endif # endif #endif typedef int8 sint8; typedef int16 sint16; typedef int32 sint32; typedef uint8 nat8; typedef uint16 nat16; typedef uint32 nat32; typedef const char * cASCIIz; // constant null terminated char array typedef char * ASCIIz; // null terminated char array #endif //primitive.h 

这取决于你的编译器。 你可以保证,至less和int一样长,但是你不能保证它会再变长。

C ++标准就是这样说的:

3.9.1,§2:

有五个有符号整数types:“signed char”,“short int”,“int”,“long int”和“long long int”。 在这个列表中,每个types至less提供了与列表中的前一个相同的存储空间。 普通整数具有执行环境的体系结构所build议的自然大小(44)。 提供其他有符号整数types以满足特殊需求。

(44),其大小足以包含在头部<climits>定义的INT_MIN和INT_MAX范围内的任何值

结论:这取决于你正在使用哪种架构。 任何其他的假设是错误的。