какой тип использовать для типа bitset в языке C - PullRequest
0 голосов
/ 04 июня 2011

Мне нужно определить тип набора битов для построения битовых массивов.Между этими массивами могут выполняться битовые операции, такие как и / или / xor (например, для их сравнения), и они являются преобладающими операциями.Какой тип я должен использовать как тип набора битов?

Я думаю, что тип должен быть самым широким НЕ имитируемым типом, который может обработать компилятор.Т.е. если компилятор моделирует 64-битный тип (например, если машина или ОС не поддерживает его), маскируя составные операции между простым и 32-битным типом, следует использовать вместо него.Как это определить?

И еще вопросы:

новый заголовок c99 определяет некоторые типы (целочисленные типы точной ширины), для которых:

"Они имеют вид intN_tи uintN_t. Оба типа должны быть представлены ровно N битами без битов заполнения. intN_t должно быть закодировано как целое число со знаком, дополненным двумя, и uintN_t как целое число без знака. Эти типы являются необязательными, если реализация не поддерживает типы с шириной 8, 1632 или 64, тогда он должен определить их по соответствующим типам с соответствующим N. Любое другое N является необязательным. "

, поэтому я думаю, что реализации, в которых проверка 64-битного типа - это первый шаг, верно?

Мой проект использует библиотеку SDL, которая # определяет макрос:

#ifdef SDL_HAS_64BIT_TYPE
typedef int64_t     Sint64;
#ifndef SYMBIAN32_GCCE
typedef uint64_t    Uint64;
#endif
#else
/* This is really just a hack to prevent the compiler from complaining */
typedef struct {
    Uint32 hi;
    Uint32 lo;
} Uint64, Sint64;
#endif

Так что, возможно, я мог бы сделать определение типа набора битов в зависимости от этого макроса (однако это не оптимально, так какЯ хотел бы написать код SDL indipendent).

Скажите мне свое мнение о.

Ответы [ 2 ]

1 голос
/ 04 июня 2011

Не существует простого способа определить максимальный размер неэмулируемого целочисленного типа, и большинство людей не пытаются его попробовать.Вы можете использовать любой из двух подходов, оба из которых работают.

  1. Решите, что вы будете использовать 32-разрядные целые числа, потому что они доступны везде.
  2. Решите, что у вас будетМакрос конфигурации (не обязательно из SDL), который контролирует, используете ли вы 32-битный или 64-битный (или 16-битный, или 128-битный) тип данных.Вы задаете правильное значение при настройке сборки.

Если вы хотите обнаружить эмуляцию против нативной, вы, вероятно, запустите некоторые тесты синхронизации для тестовой программы с различными размерами умножения.

0 голосов
/ 04 июня 2011

Традиционная практика Unix для наборов сигналов и fd заключается в использовании unsigned long (на самом деле исторически это могло быть даже long, но использование типов со знаком для наборов битов - очень очень плохая идея и почти наверняка приводит к неопределенному поведению).Хотя некоторые древние 16-битные машины могли иметь long больше, чем размер системного слова, я думаю, вам будет очень трудно найти любую современную машину с такой проблемой.С другой стороны, 64-битная Windows имеет 32-битную long, так что вы не получите оптимальный тип, но вы могли бы просто жить с ним для простоты

Другой подход, если выиметь в своем распоряжении C99 stdint.h, использовать uintptr_t.Это почти наверняка размер машинного слова.

Еще один подход, который определенно выигрывает в простоте, состоит в простом использовании байтов.

Наконец, обратите внимание, что в системах с прямым порядком байтов представление в памятибудет идентичным независимо от того, какой размер шрифта вы используете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...