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

如果我说错了请纠正我,

Int 为4字节,值范围从 -2,147,483,648到2,147,483,647(2 ^ 31)
Long 为4字节,值范围从 -2,147,483,648到2,147,483,647(2 ^ 31)

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

121296 次浏览

这取决于你的编译器。您可以保证 long 至少和 int 一样大,但是不能保证它不再这样大。

它依赖于实现。

例如,在 Windows 下它们是相同的,但是在 Alpha 系统上,long 是64位,而 int 是32位。本课程涵盖在可变平台上使用 Intel 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

在为 x64进行编译时,int 和 long 的区别在0到4个字节之间,这取决于您使用的编译器。

GCC 使用 LP64模式,这意味着 int 是32位的,而 longs 在64位模式下是64位的。

例如,MSVC 使用 LLP64模式,这意味着即使在64位模式下,int 和 longs 都是32位的。

C + + 规范本身(旧版本,但是对于这个版本已经足够好了)保持这种开放性。

有四种有符号整数类型: “ signed char”“ short int” “ int”和“ long int”在这里 列表中,每种类型至少提供 储存量比它之前的储存量大 清单。普通的整数有自然的 由... 的建筑结构表明的大小 执行环境 * ;

[脚注: 也就是说,大到足以 范围内的任何值 中定义的 INT _ MIN 和 INT _ MAX 标题 <climits>

你唯一的保证是:

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是否保证至少为32位?

正如 Kevin Haines 所指出的,INT 具有执行环境所建议的自然大小,必须适合于 INT _ MIN 和 INT _ MAX。

C89标准规定 UINT_MAX应至少为2 ^ 16-1,USHRT_MAX2 ^ 16-1和 ULONG_MAX2 ^ 32-1。这使得 short 和 int 的位计数至少为16,long 的位计数至少为32。对于 char,它明确指出它至少应该有8位(CHAR_BIT)。 C + + 继承了 lims.h 文件的这些规则,所以在 C + + 中,我们对这些值有相同的基本要求。 但是,没有应该从那个 int 至少是2字节的值派生出来。理论上,char、 int 和 long 都可以是1字节,在这种情况下,CHAR_BIT必须至少是32。只要记住“ byte”总是一个 char 的大小,所以如果 char 更大,那么一个 byte 就不仅仅是8位了。

在大多数情况下,字节数和值的范围是由 CPU 的体系结构决定的,而不是由 C + + 决定的。然而,C + + 设置了最低要求,这一点 litb 解释得很好,Martin York 只犯了一些错误。

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

依赖于编译器供应商对基本类型大小的实现 如果你曾经在别人身上编译你的代码,它将会回来纠缠你 机器架构、操作系统或其他供应商的编译器。

大多数编译器供应商都提供了一个头文件,用于定义基本类型 显式字号显式字号。 当代码可能被移植时,应该使用这些基本类型 到另一个编译器(在每个实例中读作 ALWAYS)。 例如,大多数 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 的显式原始类型名称 和 #include下面的 C/C + + 头文件(原语.h) 用于为任何 C/C + + 编译器定义具有这些名称的显式基元类型 (这个头文件实际上可能没有涵盖所有编译器,但是它涵盖了我在 Windows、 UNIX 和 Linux 上使用过的几个编译器,它也没有定义64位类型)。

#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

C + + 标准是这么说的:

3.9.1,2:

有五种有符号整数类型: “签名字符”“ short int”“ int” “ long long int”和“ long long int” 在这个列表中,每种类型至少提供 储存量与之前的一样多 在列表中 建议的自然大小 执行的架构 环境保护署(44) ; 提供整数类型以满足 特殊需要。

(44)也就是说,< b > 大到足以容纳 INT _ MIN 和 INT _ MAX,如标题中定义的 <climits> .

结论是: 这取决于您所使用的架构,其他任何假设都是错误的。