Блог пользователя sgaflv

Автор sgaflv, 14 лет назад, перевод, По-русски
На вид - простая задачка. Но в ней есть подвох!

Что бы её решить, нужен тип - 64-битный int. Проблема возникает, когда используют различные C++ компиляторы на разных платформах и архитектурах.

Сервер соревнований, похоже, 32-битный. Потому недостаточно "long int" (хотя это работает на 64-битной машине).

Не уверен, как лучше объявить такой тип. На моём Linux он называется "__int64_t", но сервер его не принимает. Сервер понимает "__int64", но это уже у меня не компилируется.

Решение, которое сработало: "long long int".
  • Проголосовать: нравится
  • +3
  • Проголосовать: не нравится

14 лет назад, # |
  Проголосовать: нравится +4 Проголосовать: не нравится
Это кстати одна из причин почему я ненавижу С++.
Потому что это маразм, что на одной платформе long - это 32 бита, а на другой - 64 бита. Еще более маразматично то, что ,если я не ошибаюсь, 64-битные платформы в C++ и Linux имеют различие в количестве битов в каком-то из стандартных типов.
  • 14 лет назад, # ^ |
      Проголосовать: нравится +1 Проголосовать: не нравится
    А за что тут ненавидеть C++?
    В Стандарте четко сказано, что рассчитывать на 64 бита можно только с long long.
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      С каким типом я могу расчитывать на 32 бита как на 32-ти, так и на 16-ух и 64-ех разрядных машинах?
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        int32_t не подойдет?
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        В общем-то, если по стандарту, то ни с каким. Типы с фиксированной разрядностью типа int32_t появятся только в новом стандарте С++. В реальных проектах, которые собираются разными компиляторами под разные платформы, приходится делать тайпдефы, зависящие от платформы/компилятора.
        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Как раз таки long int и является гарантированно 32-битным.
          • 14 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            Это в студии long 32-ух битный в 64-ех битных системах
            А в линуксе long 64-ех битный.
            По крайней мере я так понимаю вот это:
            http://www.ibm.com/developerworks/library/l-port64.html

            • 14 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится
              В смысле, что рассчитывать можно только на 32 бита.
              Но авторы компилятора имеют право заложить и большую разрядность. Не вижу в этом проблемы, за исключением случая программирования встроенных систем.
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Это неверно. В стандарте С++ типа long long нет вообще. Он есть в стандарте С99. А про 64 бита.. никогда не слышал про какие-то ограничения в 64 бита снизу для long long. Можно подтверждение?
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        В принципе уже сам нашел в стандарте С99 это ограничение. В драфте нового стандарта C++ эта константа тоже присутствует.
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Действительно, попутал с сишным стандартом.
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      <sarcasm>C++ плохой, потому что он не Java</sarcasm>
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Ну long long - обычное решение. Сто лет назад ещё __in64 приходилось использовать. Да и вообще 64-битных проверяющих серверов я не встречал никогда