2010-12-30 6 views
17

Этот вопрос возник из вопроса ранее сегодня на тему bignum библиотек и GCC конкретных хаков на языке C В частности, были использованы эти две декларации:.Что НКУ __attribute __ ((режим (XX)) на самом деле

typedef unsigned int dword_t __attribute__((mode(DI))); 

на 32-битных системах и

typedef unsigned int dword_t __attribute__((mode(TI))); 

на 64-битных системах.

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

Итак, мои вопросы просты: правильно ли это предположение? И что делают эти утверждения для основной памяти? Я думаю, что в результате у меня есть 2*sizeof(uint32_t) для dword в 32-битных системах и 2*sizeof(uint64_t) для 64-битных систем, правильно?

ответ

21

Они позволяют явно указывать размер для типа без зависимости от семантики компилятора или машины, например, от размера «long» или «int».

Они описаны достаточно хорошо on this page.

цитирую с этой страницы:

QI: целое число, которое так велик, как наименьшей адресуемой единицы, как правило, 8 бит .

HI: целое число, вдвое большее, чем целое число режима QI, обычно 16 бит.

SI: целое число, в четыре раза шире, чем QI режим integer, обычно 32 бит.

DI: An целое число, в восемь раз шире, чем QI режим integer, обычно 64 бит.

SF: A значение с плавающей точкой, такое же широкое, как SI режим integer, обычно 32 бит.

DF: A значение с плавающей точкой, такое же широкое, как DI режим integer, обычно 64 бит.

So DI по существу sizeof(char) * 8.

Дополнительное разъяснение, в том числе TI, можно найти here (возможно, лучше, чем первая ссылка, но обе предоставлены для справки).

So TI по существу sizeof(char) * 16 (128 бит).

+0

Только то, что мне было нужно, +1. Разве нет «стандартного» способа обойти это, я так понимаю? то есть объявить 128-битный тип? В его текущем использовании мы можем 'dword = word << 1' безопасно и легко; Я бы предпочел не заменять это функцией и т. Д., Если я могу помочь. –

+0

@Ninefingers: В GCC вы можете использовать '__int128', я верю: http://gcc.gnu.org/onlinedocs/gcc/_005f_005fint128.html. –

+0

@Ninefingers: GCC поддерживает типы расширений '__int128_t' и' __uint128_t' (по крайней мере, на 64-битных платформах, не уверен в 32-битных целях) –

2

@haelix Просто прочитайте этот вопрос, и я также попытался понять эту вещь. По моим данным: вы можете найти определения в файле gcc/gcc/machmode.def в дереве исходных текстов GCC.Для 'SD' должно быть:

/* Decimal floating point modes. */ 
DECIMAL_FLOAT_MODE (SD, 4, decimal_single_format); 

и "DECIMAL_FLOAT_MODE говорит:

 DECIMAL_FLOAT_MODE (MODE, BYTESIZE, FORMAT); 
declares MODE to be of class DECIMAL_FLOAT and BYTESIZE bytes 
wide. All of the bits of its representation are significant.