64-разрядные и 32-разрядные целые числа

#c

#c

Вопрос:

Есть ли хороший способ модифицировать класс в C таким образом, чтобы его целые числа были 64-разрядными в 64-разрядной системе и 32-разрядными для 32-разрядных систем? Есть ли способ проверить это?

Класс представляет собой что-то вроде:

 class B{
      public:
            int64_t size();
      private:
            int64_t m_size();
}
  

Комментарии:

1. Почему вы считаете, что это желательно?

2. Здесь уместны предопределенные макросы компилятора и заголовочные файлы .

3. Я согласен с Игнасио здесь, почти всегда лучше использовать типы фиксированного размера, тогда вы будете подвержены меньшему количеству ошибок (например, сериализации …)

Ответ №1:

Если вы действительно хотите именно то, что вы сказали (32-разрядный на 32-разрядном и 64-разрядный на 64-разрядном), вам нужно будет использовать макросы.

Но вместо этого вы, вероятно, хотите просто использовать size_t .

Редактировать:

size_t гарантированно будет достаточно большим для определения размера любого объекта и индексирования любого массива. И как таковой, он обычно 32-разрядный для 32-разрядных и 64-разрядный для 64-разрядных. Так что, вероятно, это делает именно то, что вы хотите.

Комментарии:

1. В OP никогда не указывалось signed или unsigned. Но, основываясь на способе его использования, я собираюсь предположить, что unsigned подходит.

2. или просто long который равен 32 битам на x86 и 64 битам на x86-64 с gcc . Или, возможно, некоторые из «быстрых» типов в <stdint.h> ?

3. @Basile Starynkevitch: Однако это не поддерживается в Windows. long всегда 32-разрядный в Windows — даже на x64.

4. @Nim, там тоже есть ssize_t .

5. @SimonRichter: ptrdiff_t является стандартным типом со знаком для смещения указателя. ssize_t является типом Posix и обычно означает «размер или код ошибки», а не смещение со знаком.

Ответ №2:

Существует intptr_t , который может быть использован в гнусных целях, которые вы, вероятно, имеете в виду.

Ответ №3:

Вы могли бы использовать long int . AFAIK long int совпадает с int (4-байтовым целым числом) в 32-разрядных компиляторах и совпадает с long long int (8-байтовым целым числом) в 64-разрядных компиляторах. Вы можете проверить это с помощью sizeof .