Существует ли стандартный способ определения ширины оборудования? - PullRequest
5 голосов
/ 27 июля 2010

Переменные типа int, как утверждается, являются «длиной одного машинного слова», но во встроенных системах компиляторы C для 8-битного микроиспользования имеют int из 16 бит !, (8 бит для беззнакового символа), а затем для большего количества бит,int ведет себя нормально: в 16-битных micros int тоже 16-битные, а в 32-битных micros int - это 32-битные и т. д.

Итак, есть ли стандартный способ проверить это, например, BITSIZEOF (int)?

как "sizeof" для байтов, но для битов.

это была моя первая идея

    register c=1;                
    int bitwidth=0;
    do
    {

        bitwidth++;

    }while(c<<=1);

    printf("Register bit width is : %d",bitwidth);

Но он принимает c как int, и в 8-битных компиляторах обычно используют int как 16-битные, поэтому он дает мне 16 как результат,Кажется, нет никакого стандарта для использования "int" в качестве "ширины регистра", (или это не соблюдается)

Почему я хочу его обнаружить?Предположим, мне нужно много переменных, которым нужно менее 256 значений, поэтому они могут быть 8, 16, 32 бита, но использование правильного размера (такого же, как память и регистры) ускорит процесс и сэкономит память, а если это невозможнорешил в коде, я должен переписать функцию для каждой архитектуры

РЕДАКТИРОВАТЬ После прочтения ответов я нашел эту хорошую статью

http://embeddedgurus.com/stack-overflow/category/efficient-cc/page/4/

Я приведу заключение (полужирный шрифт)

Таким образом, суть в следующем.Если вы хотите начать писать эффективный, переносимый встроенный код, первым делом вы должны начать использовать типы данных C99 «наименьший» и «быстрый».Если ваш компилятор не совместим с C99, тогда будут жаловаться до тех пор, пока он не станет ... или смените поставщиков. Если вы сделаете это изменение, я думаю, вы будете приятно удивлены достигнутыми улучшениями в размере и скорости кода.

Ответы [ 7 ]

17 голосов
/ 27 июля 2010

Я должен переписать функцию для каждой архитектуры

Нет, не надо.Используйте C99 stdint.h, который имеет такие типы, как uint_fast8_t, который будет типом, способным содержать 256 значений, и быстро.

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

Намного лучше, чем переписывать каждую функцию.

7 голосов
/ 27 июля 2010

Чтобы ответить на ваш более глубокий вопрос более прямо, если вам нужны очень специфичные размеры хранилища, переносимые между платформами, вы должны использовать что-то вроде types.h stdint.h, которое определяет типы хранилища, указанные количество бит.

Например, uint32_t всегда без знака 32 бита, а int8_t всегда со знаком 8 битов.

7 голосов
/ 27 июля 2010
#include <limits.h>

const int bitwidth = sizeof(int) * CHAR_BIT;
1 голос
/ 27 июля 2010

Я не совсем понимаю, что вы подразумеваете под "нет стандарта для использования" int "в качестве" ширины регистра ". В оригинальной спецификации языка C (C89 / 90) тип int подразумевается в определенных контекстахкогда явный тип не указан. Ваш register c эквивалентен register int c, и это совершенно стандартно в C89 / 90. Обратите внимание также, что спецификация языка C требует, чтобы тип int поддерживал как минимум диапазон -32767 ... + 32767Это означает, что на любой платформе int будет по крайней мере 16 битов, формирующих значение.

Что касается ширины битов ... sizeof(int) * CHAR_BIT даст вам количество бит в объектном представлении типа int.

Теоретически, представление значения типа int не гарантирует использование всех битов своего представления объекта. Если вам нужно определить количество битов, используемых для представления значения, вы можете просто проанализироватьзначения INT_MIN и INT_MAX.

PS Глядя на заголовок вашего вопроса, я подозреваю, что вам действительно нужно только значение CHAR_BIT.

1 голос
/ 27 июля 2010

Компилятор, для которого вы компилируете ISA , уже известен компилятору, когда он запускает ваш код, поэтому вам лучше всего обнаружить его во время компиляции. В зависимости от вашей среды, вы можете использовать все от стиля autoconf / automake до более низкого уровня # ifdef, чтобы настроить свой код на конкретную архитектуру, на которой он будет работать.

0 голосов
/ 27 июля 2010

Я думаю, что в этом случае вам не нужно знать, сколько бит имеет ваша архитектура.Просто используйте как можно меньшие переменные, если хотите оптимизировать свой код.

0 голосов
/ 27 июля 2010

Подходит ли unsigned char или unsigned short к вашим потребностям? Почему бы не использовать это? Если нет, вы должны использовать флаги времени компиляции для ввода соответствующего кода.

...