Разница между тип uint32 С и uint32 Т

насколько я знаю суффикс t на uint32_t обозначения type имя, но мне интересно знать, что такое C на UINT32_C и в чем различия?

5 ответов


UINT32_C - это макрос, который определяет целочисленную константу типа uint_least32_t. Например:

UINT32_C(123) // Might expand to 123UL on system where uint_least32_t is unsigned long
              // or just 123U, if uint_least32_t is unsigned int.

7.20.4.1 макросы для целочисленных констант минимальной ширины

  1. макрос INTN ° С(стоимостью) расширяется до выражения целочисленной константы соответствует типу int_leastNІТ. Макрос uint сN ° С(стоимостью) расширить целочисленному постоянному выражению, соответствующему типу uint_leastNІТ. Для например, если uint_least64_t - это имя типа unsigned long long int, тогда UINT64_C(0x123) может расширяться до целочисленной константы 0x123ULL.

таким образом, возможно, что эта константа составляет более 32 бит в некоторых редких системах.

а если вы находитесь на система, в которой определено несколько типов дополнения 8-бит 2 (Большинство современных систем) и uint32_t существует, то это создает 32-битную константу.

они все определены в stdint.h, и были частью стандарта C с C99.


UINT32_C - это макрос для записи константы типа uint_least32_t. Такая константа подходит, например, для инициализации uint32_t переменной. Я нашел, например, следующее определение в АВР-библиотеки libc (это для цели AVR, как пример):

#define     UINT32_C(value)   __CONCAT(value, UL)

Итак, когда вы пишете

UINT32_C(25)

он расширен до

25UL

UL является суффиксом для unsigned long целочисленная константа. Макрос полезен, потому что нет стандарта суффикс uint32_t, так что вы можете использовать его, не зная, что на вашу цель, uint32_t это typedef, например,unsigned long. Что касается других целей, то они будут определены по-другому.


эти константы определяются примерно так:

#define UINT32_C(value) (value##UL)

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

UINT32_C(10); // compiles

uint32_t x = 10;
UINT32_C(x); // does not compile

Не знаю о keil, но, по крайней мере, в Linux UINT32_C-это макрос для создания литерала uint32_t.

и, как упоминалось другими, uint32_t-это тип, определенный как C99 в stdint.h.


это макрос, добавляющий суффикс, создающий литерал, например #define UINT32_C(c) c##UL