質問: C++において、int型とlong型とlong long型の違いについて教えていただきたいです。 特に表現できる上限値について知りたくて、調べてみると下記な認識です。 int -> 2^31 - 1 long -> 2^31 - 1 long long -> 2^63 - 1 intとlong longの違いはわかるのですが、longの位置付けがよくわからないです。 longもlong longも2^63 - 1ですし。Atcoderの解説の動画で、intで足りない場合はlong longを使うといった内容を解説されたのですが、え、intの次っていったらlongじゃないのかな? などと疑問に思って調べてみたらなおさらよくわからなくなったという背景です。 longとlong longの違いについて、上限値の観点で説明いただけますと助かります。 バージョンによるかもしれないので、c++11使ってることも共有しておきます。 よろしくおねがいします。
回答: みなさんが回答されているようにC言語およびC++言語では`int`、`long`、`long long`のサイズは指定されておらず実装依存です。 例えばVisual C++およびWindowsでは > > `int` 32bit > > `long` 32bit > > `long long` 64bit > > > と定められています。 AtCorderについてググって見つけた範囲ではLanguage Testのページに > > 注意:AtCoderのジャッジサーバーに関する情報は以下を参照してください > > > > ``` > $ uname -a > Linux ip-***-***-***-*** 3.13.0-74-generic #118-Ubuntu SMP Thu Dec 17 22:52:10 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux > $ cat /etc/lsb-release > DISTRIB_ID=Ubuntu > DISTRIB_RELEASE=14.04 > DISTRIB_CODENAME=trusty > DISTRIB_DESCRIPTION="Ubuntu 14.04.4 LTS" > > ``` > > とありLinux x86_64を使用しているようです。LinuxではLinux Standard Baseが定められていてLinux Standard Base Core Specification for X86-64 / Chapter 7. Low Level System Information / 7.1. Machine Interface / 7.1.2. Data Representation / 7.1.2.3. Fundamental Typesでは > > LSB-conforming applications shall use only the fundamental types described in Section 3.1.2 of System V Application Binary Interface AMD64 Architecture Processor Supplement. > > > と定められており、System V Application Binary Interface AMD64 Architecture Processor Supplement / Chapter 3 Low Level System Information / 3.1.2 Data Representation / Fundamental Typesでは > > `int` 32bit > > `long` 64bit > > `long long` 64bit > > > と定められています。同様に調べるとわかりますがLinux x86では`long`が32bitと定められているため、`long`はx86とx86_64とでサイズが異なります。