2013-12-15 2 views
4

Как вы (если возможно) определяете тип по целочисленному размеру? Например, если бы я хотел создать тип длиной 3 байта, как я мог бы сделать что-то подобное? (Я знаю, что это неправильно)Тип указателя на основе целочисленного размера (C99)

typedef int24_t 3; 

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

Однако я хочу сделать так, чтобы вы могли передать числовой параметр, который определяет, насколько велика будет тип переменной, хранящей числа: т. Е. Если бы это было 1, то тип мог бы быть символом, если бы это было 4, тип мог бы быть int и т. д.

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

Благодаря

+1

Если вы хотите, чтобы * данные * были переносимыми, вам нужно иметь дело с endianess, нет никакого способа обойти это. Если * данные * будут оставаться на одной платформе (независимо от того, что это такое), тогда вам не о чем беспокоиться. –

+0

Вероятно, нет 24-битного целочисленного типа. Поскольку 'typedef' создает псевдоним только для существующего типа, а не для нового типа, нет никакого способа обойти это - если вам действительно нужен его целочисленный тип. –

ответ

3

Вы можете использовать-структуру, это не элегантный, но похоже на то, что вы ищете. Обратите внимание, что вы должны определить выравнивание структуры в 1 байт. Вы также ограничены до 64 бит.

typedef struct Int24 { 
    int value : 24; 
} Int; 

typedef struct UInt24 { 
    unsigned value : 24; 
} UInt24; 

typedef struct Int48 { 
    long long value : 48; 
} Int48; 

с шаблонами:

template<int bytes> struct Int { 
    long long value : bytes * 8; 
}; 
typedef Int<1> Int8; 
typedef Int<6> Int48; 

С макро:

#define DECL_INT(n)   \ 
    typedef struct _Int##n { \ 
     long long value : n; \ 
    } Int##n 

// declaration of type 
DECL_INT(48); // produces Int48 

// usage 
Int48 i48; 
+0

удален 72bit int. long day :( – egur

+0

Я подумал о том, чтобы сделать что-то вроде этого, но мне нужно обобщение, поэтому мне не нужно было определять структуру для каждого размера целого числа – joelyboy94

+0

Добавлена ​​альтернатива шаблонами – egur

1
 struct smallerint 
     { 
     unsigned int integer:24; //(24=24bits=3bytes) 
     }; 

     typedef struct smallerint int24_t; 
0

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

Смежные вопросы