如果我错了,请纠正我,
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 ++有什么区别?它们可以互换使用吗?
它取决于实现。
例如,在 Windows 下它们是相同的,但例如在 Alpha 系统上,long 是 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
保证至少为 32 位?
为 x64 编译时,int 和 long 之间的差异在 0 到 4 个字节之间,具体取决于您使用的编译器。
GCC 使用 LP64 模型,这意味着 int 是 32 位,而 long 在 64 位模式下是 64 位。
例如,MSVC 使用 LLP64 模型,这意味着即使在 64 位模式下,int 和 long 都是 32 位。
C++ 规范本身(旧版本,但足够好)保持开放。
有四种有符号整数类型:'
signed char
'、'short int
'、'int
' 和 'long int
'。在此列表中,每种类型提供的存储空间至少与列表中它前面的类型一样多。普通整数具有执行环境架构建议的自然大小*;[脚注:也就是说,足够大以包含 INT_MIN 和 INT_MAX 范围内的任何值,如 header 中所定义
<climits>
。---结束脚注]
正如 Kevin Haines 指出的那样,int 具有执行环境建议的自然大小,它必须适合 INT_MIN 和 INT_MAX。
C89 标准规定UINT_MAX
至少应为 2^16-1、2 USHRT_MAX
^16-1 和ULONG_MAX
2^32-1 。这使得 short 和 int 的位数至少为 16,long 为 32。对于 char 它明确指出它应该至少有 8 位 ( CHAR_BIT
)。C++ 继承了 limits.h 文件的这些规则,因此在 C++ 中,我们对这些值有相同的基本要求。但是,您不应该从该 int 至少为 2 个字节中得出。理论上,char、int 和 long 都可以是 1 个字节,在这种情况下CHAR_BIT
必须至少为 32。请记住,“字节”始终是 char 的大小,所以如果 char 更大,一个字节不仅仅是 8 位任何更多的。
这取决于你的编译器。可以保证 long 至少与 int 一样大,但不能保证它会更长。
在大多数情况下,字节数和值的范围是由 CPU 的体系结构决定的,而不是由 C++ 决定的。然而,C++ 设定了最低要求,litb 解释得当,Martin York 只犯了一些错误。
不能互换使用 int 和 long 的原因是它们的长度并不总是相同。C 是在 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++ 头文件 (primitive.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:
有五种有符号整数类型:“signed char”、“short int”、“int”、“long int”和“long long int”。在此列表中,每种类型提供的存储空间至少与列表中它前面的类型一样多。普通整数具有执行环境架构所建议的自然大小(44);提供其他有符号整数类型以满足特殊需要。
(44) 即大到足以包含 INT_MIN 和 INT_MAX 范围内的任何值,如 header 中所定义
<climits>
。
结论:这取决于您正在处理的架构。任何其他假设都是错误的。