Разница между тип 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 макросы для целочисленных констант минимальной ширины
- макрос 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.