Open1
long long と int64_t の違い
long longは64ビット以上の幅であることが保証されるが、64ビット固定の整数型が必要な場合には、int64_t型を使用することを推奨する
といった説明がされているが、今まであまりピンとこなかった...
ちなみに、APG4bだと 3.01 で 「int64_t
が一般的」という説明がある。
ところが、AtCoderのコンテストで「long long は良くても int64_t だとエラーになるケース」が見つかり、「long long を使わないといけないケースが有る」ということを知った。
エラーメッセージには
./Main.cpp:21:59: error: no matching function for call to ‘max(long long int, long int)’
21 | ll duplicated = max(0ll, min(r1, r2) - max(l1, l2) + 1);
|
とあり、 min(r1, r2) - max(l1, l2) + 1)
の部分が long int
と解釈された(long long int
ではないと解釈された)ようにみえる。
std::min
および 中の std::max
の定義を調べると
template<typename _Tp>
_GLIBCXX14_CONSTEXPR
inline const _Tp&
min(const _Tp& __a, const _Tp& __b) { ... }
template<typename _Tp>
_GLIBCXX14_CONSTEXPR
inline const _Tp&
max(const _Tp& __a, const _Tp& __b) { ... }
となっているので、すなわち r1, r2
の型である int64_t
が使われているはず...
なので、結果として int64_t
が long int
と解釈されたことになるのかな...?
int64_t
の定義を見に行くと、
#ifndef _INT64_T
#define _INT64_T
typedef long long int64_t;
#endif
とあったので、結局「環境によっては long int に解釈されちゃう」という話になるのかな...
ひとまずそれで理解することにして、今後似たような問題にぶつかったら long long を試す、という方法で...