C ++のintとlongの違いは何ですか?


120

私が間違っていたら訂正してください

intは4バイトで、値の範囲は-2,147,483,648〜2,147,483,647(2 ^ 31)です。
長さは4バイトで、値の範囲は-2,147,483,648〜2,147,483,647(2 ^ 31)です。

C ++の違いは何ですか?それらは交換可能に使用できますか?


32ビットプロセッサで実行しているVS2005では、intのデフォルトサイズは4バイトです。


移植可能なコードを記述したい場合は#include <stdint.h>、サイズを指定する型を使用してから検討してください。例えばuint32_t。新しいプラットフォームでは、stdint.hがその特定のプラットフォームで正しく機能し、コードが意図したとおりに機能することを確認するだけで済みます。
BitTickler 2014年

回答:


112

実装に依存します。

たとえば、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  

この回答(例による回答)と、C ++標準に関する以下の詳細のいくつかを組み合わせることを検討する必要があると思います。C ++ 0xのドラフトはopen-std.org/JTC1/SC22/WG21/docs/papers/2008/n2798.pdfにあり、最後のリビジョンとの違いを確認できるようにマークアップされています。
Patrick Johnmeyer、2008年

タイプの相対的なサイズ順で何かを含めると、異なるプラットフォームのサイズを列挙するよりも多くの情報が得られます(@Kevinの状態がとてもうまくいきます)。(-1投票)
xtofl 2008年

2
一部のコンパイラには、intとlongのデフォルトサイズを変更できるフラグがあります。つまり、8または16に強制できます。詳細については、コンパイラのドキュメントを参照してください。
マーティンヨーク

7
これらは長い
ロジャーパック

1
intのサイズも含めてください。
cegprakash 2014年

82

あなたが持っている唯一の保証は:

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ビットであること保証されていますか?


1
うーん、これは成立しません。sizeof(short)> = sizeof(char)の場合、sizeof(short)> = 1(> = 2ではない)のみがわかります。これは、すべてのタイプに当てはまります。このsizeof(任意の整数型)> = 1によると、どちらが正しいですか。たとえば、Z80でsizeof(int)== 1を覚えていますが、長い保証はありませんか?
Andreas Magnusson

6
C ++標準の3.9.1.2は、sizeof(long)> = sizeof(int)> = sizeof(short)> = sizeof(char)と指定しています5.3.3.1 C ++標準の5.3.3.1は、sizeof(char)、sizeof(unsigned char)と指定しています、およびsizeof(signed char)は1に等しい(続き...)
KTC、

4
(... cont)整数型で表すことができる最大値と最小値は、<limits.h>でマクロとして定義されています(したがって、<climits>)。C ++標準からの参照により組み込まれているC(1990)標準の付録Eでは、これらのマクロの最小の大きさを指定しています。(続き...)
KTC

4
(... cont)そしてそれらは(2 ^ 15)-1、(2 ^ 15)-1、(2 ^ 31)-1で、それぞれshort、int、longであり、次のような値になります。 CHAR_BITが8(これは最小値でもある)の場合、Martin Yorkが彼の応答でここに投稿しました。
KTC

2
@ジャイルズ:それは私が上で言ったことではありませんか?sizeof(short)* CHAR_BITS> = 16.他のいくつかをプラスします。:-)
マーティンヨーク

13

x64用にコンパイルする場合、使用するコンパイラーに応じて、intとlongの差は0から4バイトの間になります。

GCCはLP64モデルを使用します。つまり、intは32ビットですが、longは64ビットモードでは64ビットです。

たとえば、MSVCはLLP64モデルを使用します。これは、64ビットモードでもintとlongの両方が32ビットであることを意味します。


おそらく0バイト?hmm
rogerdpack

12

C ++仕様自体(このため、旧バージョンが、良い十分な)は、このオープンを残します。

符号付き整数型にはsigned char、「short int」、「int」、「」、および「long int」の4つがあります。このリストでは、各タイプは、少なくともリストの前のタイプと同じ量のストレージを提供します。プレーンなintは、実行環境のアーキテクチャー*が示唆する自然なサイズを持っています。

[脚注:つまり、ヘッダーで定義されているINT_MINとINT_MAXの範囲の値を含めるのに十分な大きさ<climits>。--- foonoteを終了]


7

Kevin Hainesが指摘するように、intは実行環境によって提案された自然なサイズを持ち、INT_MINとINT_MAX内に収まる必要があります。

C89標準状態UINT_MAX^ 16-1少なくとも2である必要があり、USHRT_MAX^ 16-1 2とULONG_MAX2 ^ 32-1。これにより、shortとintのビット数は少なくとも16、longのビット数は32になります。charの場合、少なくとも8ビット(CHAR_BIT)が必要であることを明示します。C ++は、limits.hファイルのこれらのルールを継承するため、C ++では、これらの値に対して同じ基本的な要件があります。ただし、そのintが少なくとも2バイトであることから派生させるべきではありません。理論的には、char、int、longはすべて1バイトになる可能性がCHAR_BITあり、その場合は少なくとも32 バイトである必要があります。「byte」は常にcharのサイズであることを覚えておいてください。もっと。


byteC ++にはデータ型が存在するとは思いませんでした。そうではありませんか?そうであり、a byteが8ビット以外のサイズを持つことができる場合、それは純粋に愚かです。絶対に8ビットでなければならないのに、なぜバイトと呼ぶのでしょうか。
Alderath、

6

コンパイラによって異なります。longが少なくともintと同じ大きさであることが保証されていますが、それ以上になることは保証されていません。


5

ほとんどの場合、バイト数と値の範囲は、C ++ではなくCPUのアーキテクチャによって決まります。ただし、C ++は最小要件を設定します。これはlitbが適切に説明し、Martin Yorkはいくつかの間違いを犯しただけです。

intとlongを同じ意味で使用できないのは、それらが常に同じ長さであるとは限らないためです。Cは、バイトが8ビットで、intが2バイトで、ハードウェア命令で直接処理できるPDP-11で発明されました。Cプログラマーは4バイトの算術演算を必要とすることが多いため、発明されたlongは4バイトであり、ライブラリー関数によって処理されました。他のマシンは異なる仕様を持っていました。C標準は、いくつかの最小要件を課しました。


5

コンパイラベンダーのプリミティブタイプサイズの実装に依存しているため、コードを別のマシンアーキテクチャ、OS、または別のベンダーのコンパイラでコンパイルした場合、再び悩まされることになります。

ほとんどのコンパイラベンダーは、明示的な型サイズを持つプリミティブ型を定義するヘッダーファイルを提供しています。これらのプリミティブ型は、コードが別のコンパイラに移植される可能性がある場合に使用する必要があります(すべてのインスタンスでこれを常に読み取る)。たとえば、ほとんどの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 ++コンパイラに対してこれらの名前で明示的なプリミティブ型を定義することを目的とした次のC / C ++ヘッダーファイル(primitive.h)を使用しています(このヘッダーファイルは実際にはすべてをカバーしていない場合があります)コンパイラーですが、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

C99では、int32_t、uint64_tなどのtypdefsがコンパイラーによって定義され、名前が示すのとまったく同じ数のビットを持つことを義務付けています。ほとんどのC ++コンパイラ(g ++を含む)では、これらの定数をC ++コードで使用できます。
rmeador 2008年

5

C ++標準では、このようにそれを言います:

3.9.1、§2:

「signed char」、「short int」、「int」、「long int」、「long long int」の5つの符号付き整数型があります。このリストでは、各タイプは、少なくともリストの前のタイプと同じ量のストレージを提供します。プレーンなintは、実行環境のアーキテクチャー(44)によって提案された自然なサイズを持っています。その他の符号付き整数型は、特別なニーズを満たすために提供されています。

(44)つまり、ヘッダーで定義されているINT_MINとINT_MAXの範囲の値を含めるのに十分な大きさ <climits>です。

結論:作業しているアーキテクチャによって異なります。その他の仮定はすべて誤りです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.