

お世話になります。

1≤A≤B≤10^18,1≤C,D≤10^9  
であるときにコンソール上から数値を入力しようとしたのですが、  
うまく各変数に入っていないようです。小さな値なら入るのですが、  
大きくなると入りません。どのようにすれば、大きな値も入るでしょうか。  
以下が書いたコードです。windows上で実行しております。  
よろしくお願いいたします。

[code]

    #include<iostream>
    using namespace std;
    int main(){
        long A,B,C,D;
    
        cin >> A >> B >> C >> D;
    
        printf("%ld,%ld,%ld,%ld",A,B,C,D);
        return 0;
    }
    
[/code]


CC BY-SA 4.0
2019-07-05T14:08:20.433
56424
2019-07-07T21:27:03.100
30396
question
c++ windows
c++で大きな値をコンソール入力したときに、うまく読み込めません


お使いのpcは何bitですか？  
Linuxだとlong型は10^18まで格納できますが、windowsだと32bit版の場合はlongの範囲は-2147483648 〜
2147483647となります。  
詳しいことをは調べてみてください。  
解決策として、long long型を使えばできると思います。


CC BY-SA 4.0
2019-07-05T15:04:35.293
56427
2019-07-05T15:09:52.717
2019-07-05T15:09:52.717
29506
29506
56424
answer


前提としてC++言語の[整数型](https://ja.cppreference.com/w/cpp/language/types#.E6.80.A7.E8.B3.AA)はサイズが既定されていません。表にあるように`long`は「少なくとも32ビット幅」であり、これで表現できるのは-2,147,483,648から2,147,483,647までです。  
また`long
long`であれば「少なくとも64ビット幅」となるため、-9,223,372,036,854,775,808から9,223,372,036,854,775,807まで表現できるようになります。

別の方法として`<cstdint>`で提供される[固定幅の整数型](https://ja.cppreference.com/w/cpp/types/integer)で`int64_t`を使用すれば明確に64ビット幅を得られます。

なお、[Windows環境における`long`は4バイト幅](https://docs.microsoft.com/en-us/cpp/cpp/data-
type-ranges?view=vs-2019)と定められています。（日本語ページは機械翻訳によって誤った場所にも`long`が出現しているので注意）

* * *

champonさん、peridotiteさん共に誤解されているようですが、Windowsが32bit / 64bit、MinGWが32bit /
64bitかどうかに関わらず、Windows環境においては `long` は4バイト幅と定められています。  
API呼び出しや`printf`のフォーマットなどに支障が出るため、基本的にはプラットフォーム（この場合はMicrosoft社）が定めたサイズに従っています。（と言いつつ、MinGWは`long
double`のサイズを間違えているため、しばしば[問題](https://ja.stackoverflow.com/a/34023/4236)になっています。）


CC BY-SA 4.0
2019-07-05T20:47:57.327
56433
2019-07-07T21:27:03.100
2019-07-07T21:27:03.100
4236
4236
56424
answer