間違っていたら訂正して、
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
x64 用にコンパイルする場合、使用するコンパイラに応じて、int と long の差は 0 から 4 バイトの間になります。
GCC は LP64 モデルを使用します。つまり、int は 32 ビットですが、64 ビット モードでは long は 64 ビットです。
たとえば、MSVC は LLP64 モデルを使用します。つまり、64 ビット モードでも int と long の両方が 32 ビットです。
C++ 仕様自体(古いバージョンですが、これには十分です) はこれを未解決のままにしています。
符号付き整数型には、' '、
signed char
'short int
'、'int
'、および 'long int
' の 4 つがあります。このリストでは、各タイプは、少なくともリスト内の前のタイプと同じ量のストレージを提供します。プレーンな int は、実行環境のアーキテクチャによって提案される自然なサイズを持ちます*。[脚注: つまり、ヘッダーで定義されているように、INT_MIN と INT_MAX の範囲内の任意の値を含めるのに十分な大きさ
<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 のサイズであることを覚えておいてください。もっと。
それはあなたのコンパイラに依存します。long が少なくとも int と同じ大きさになることは保証されていますが、それ以上になることは保証されていません。
ほとんどの場合、バイト数と値の範囲は、C++ではなくCPUのアーキテクチャによって決定されます。ただし、C ++は最小要件を設定します。これは、litbが適切に説明し、MartinYorkがいくつかの間違いを犯しただけです。
intとlongを同じ意味で使用できない理由は、それらが常に同じ長さであるとは限らないためです。Cは、1バイトが8ビット、intが2バイトで、ハードウェア命令によって直接処理できるPDP-11で発明されました。Cプログラマーはしばしば4バイトの演算を必要とするため、longが発明され、ライブラリ関数によって処理される4バイトでした。他のマシンは異なる仕様を持っていました。C規格は、いくつかの最小要件を課しました。
プリミティブ型サイズのコンパイラベンダーの実装に依存することは、別のマシンアーキテクチャ、OS、または別のベンダーのコンパイラでコードをコンパイルした場合に、あなたを悩ませることになります。
ほとんどのコンパイラベンダーは、明示的な型のサイズでプリミティブ型を定義するヘッダーファイルを提供しています。これらのプリミティブ型は、コードが別のコンパイラに移植される可能性がある場合に使用する必要があります(すべてのインスタンスで常にこれを読んでください)。たとえば、ほとんどのUNIXコンパイラには。がありint8_t uint8_t int16_t int32_t uint32_t
ます。Microsoftには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」、および「longlongint」の5つがあります。このリストでは、各タイプは、リスト内でその前にあるものと少なくとも同じ量のストレージを提供します。プレーンintは、実行環境のアーキテクチャによって提案される自然なサイズを持っています(44)。他の符号付き整数タイプは、特別なニーズを満たすために提供されています。
(44)つまり、ヘッダーで定義されているように、INT_MINからINT_MAXの範囲の値を含むのに十分な大きさ
<climits>
です。
結論:それはあなたが取り組んでいるアーキテクチャに依存します。その他の仮定は誤りです。