UINT32_C va uint32_t o'rtasidagi farq

t ype nomi bilan t qo'shimchasini bilsam, C ni bilishni hayron qilaman > UINT32_C da va farqlar nimadan iborat?

6
uint32_t standart sobit-kenglik tamsayt turi , va tizim sarlavhasi faylida tavsiflanadi. Bu standart tip bo'lgani uchun platformalar o'rtasida ko'chma bo'ladi.
qo'shib qo'ydi muallif Some programmer dude, manba

5 javoblar

UINT32_C is a macro which defines integer constant of type uint_least32_t. For example:

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 Minimal kenglikdagi integer sobit uchun makrolar

     
      
  1. INT N _C ( qiymati ) makrosini aniq raqamli tamsayinga    int_least N _t turiga mos keladi. UINT N _C ( qiymati ) makrosini kengaytirish kerak.    uint_least N _t turiga mos keladigan butun sonli doimiy iboraga o'tkazing. Uchun   Masalan, agar uint_least64_t - unsigned long long int turi uchun nom bo'lsa,    UINT64_C (0x123) to'liq kodli 0x123ULL ga oshib ketishi mumkin.
  2.   

Shunday qilib, bu turg'un noyob tizimlarda 32 bitdan ko'p bo'lishi mumkin.

Agar siz 8-bitni 2-sonli komplement turlari turlarini (ko'pchilik zamonaviy tizimlar) aniqlaydigan tizimda bo'lsangiz va uint32_t mavjud bo'lsa, bu 32-bitlik sog'lomlikni hosil qiladi.

Ularning barchasi stdint.h da aniqlanadi va C99dan beri C standartining bir qismi hisoblanadi.

10
qo'shib qo'ydi

UINT32_C is a macro for writing a constant of type uint_least32_t. Such a constant is suitable e.g. for initializing an uint32_t variable. I found for example the following definition in avr-libc (this is for the AVR target, just as an example):

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

Shunday qilib, yozsangiz

UINT32_C(25)

u kengaytirildi

25UL

UL is the suffix for an unsigned long integer constant. The macro is useful because there is no standard suffix for uint32_t, so you can use it without knowing that on your target, uint32_t is a typedef e.g. for unsigned long. With other targets, it will be defined in a different way.

5
qo'shib qo'ydi
uchun spec ni qayta o'qing.
qo'shib qo'ydi muallif Jonathan Leffler, manba
@PeterJ - Men sizni ISO C qo'mitasidan juda yaxshi ko'rmaysiz.
qo'shib qo'ydi muallif StoryTeller, manba
@PeterJ - Bu, albatta, foydasiz emas. O'zgaruvchini ishga tushirish uchun uni ishlatmaysiz, lekin argumentni _Generic tanlovi orqali tanlangan funksiyaga o'tkazish haqida nima deyish mumkin? Ruxsat turi turlicha bo'ladi.
qo'shib qo'ydi muallif StoryTeller, manba
Siz hatto 8bit platformalarda ham ishlatilganini ko'rganmisiz? Raqamlaringizni o'zingiz yozishingiz yaxshiroqdir. Bu kodni o'qib bo'lmaydigan holga keltiradi - yoki, ehtimol, qo'shimcha "normal" raqamlardan
qo'shib qo'ydi muallif PeterJ_01, manba
@StoryTeller ular muammolarni bartaraf qilmaydi va Cdan boshqa tilni qilishga harakat qiladi. Foydasiz. C ning kuchi uning soddaligi, juda ko'p ajralmaslikdir. C va C ++ dasturlarini faol ravishda ishlataman va C ++ ning C ++ kabi funktsiyalarini bajarishning biron bir nuqtasini ko'rmaysiz.
qo'shib qo'ydi muallif PeterJ_01, manba
@StoryTeller bir xil foydasiz xususiyat. Xatolarni topish juda qiyin manba. Ehtimol, C ++ kabi bo'lishi va aytaylik: sizda ham C ga ortiqcha yuklashingiz mumkin. Agar siz C ++ da ortiqcha yuk yozishni talab qilsangiz
qo'shib qo'ydi muallif PeterJ_01, manba
@Felix Palmen Ehtimol, S nazariyotchilariga 8 bitlik maqsadlarni dasturlash kerak bo'lmadi va ularning bilimlari nazariy va nomutanosib, amaliy qiymati bo'lmagan
qo'shib qo'ydi muallif PeterJ_01, manba
8 va 64 bitli platformalarda ishlaydigan va ishlaydigan @Felix Palmen kodiga tegmang. 8 bit platformalar 8 bitli matematik operatsiyalardan ortiq bo'lgan juda aniq dasturiyani talab qiladi. Eslab qoling - 8 bitlik maqsadlar ko'pincha apparatni ko'paytirishga ega emas
qo'shib qo'ydi muallif PeterJ_01, manba
To'liq. Bu standart, ammo IMO foydasiz
qo'shib qo'ydi muallif PeterJ_01, manba
@PeterJ: 64bit LP64 maqsadini va 8bitli maqsadni kompilyatsiya qilishni istagan kodni yozing. 8bitli maqsad 16bit int bo'ladi, shuning uchun 32767 dan ancha kattaroq bir qo'shimchacha topilmaydi. Biroq, LP64 maqsadidagi kompilyator, UL sonekini istalgan narsani emas, balki 64bit qiymatiga yozib oladi.
qo'shib qo'ydi muallif Felix Palmen, manba
@PeterJ Men qanday foydali ekanligini tushuntirishga harakat qildim (va 8bit mcsga mo'ljallangan kompilyatorni o'ylayapman, deb o'ylayman), lekin aslida bunday narsalarga hech qachon ehtiyoj sezmadim.
qo'shib qo'ydi muallif Felix Palmen, manba
@PeterJ Bilasizmi, C ning bitta dizayn maqsadi aslida mavhum qurilmadan. Men ushbu makrolar talab qiladigan vaziyatni ehtimol kam deb hisoblayman (shuning uchun bu misol keltirib chiqarilgan), ammo ular bu to'g'ri ajralmaslikka erishish uchun o'sha erda.
qo'shib qo'ydi muallif Felix Palmen, manba
@JonathanLeffler yomon, standartni tekshirdim, lekin aniq identifikatorni qidiryapman. Javobni yangilaydi.
qo'shib qo'ydi muallif Felix Palmen, manba

Bu sobit quyidagi kabi aniqlanadi:

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

Siz faqat doimiy qiymatlarni so'l argumenti sifatida qo'yishingiz mumkin, aks holda u tuzilmaydi.

UINT32_C(10);//compiles

uint32_t x = 10;
UINT32_C(x);//does not compile
3
qo'shib qo'ydi

Keil haqida bilmayman, lekin hech bo'lmaganda Linuxda UINT32_C uint32_t literalini yaratish uchun so'l.

Va boshqalar tomonidan aytilganidek, uint32_t - stdint.h da C99dan belgilangan bir tur.

2
qo'shib qo'ydi

It is the macro appending the suffix creating the literal for example #define UINT32_C(c) c##UL

1
qo'shib qo'ydi
Ushbu javob oddiygina so'lga qo'shimcha qo'shimchani bildiradi. Noaniqlik uchun qandaydir oqilona asos yo'q, natijada bunday turdagi hech qanday eslatma yo'q, buning qiymati ham qo'shimcha bo'lishi mumkinligi haqida gapirmaslik kerak. Kichkina: C da bir literal emas, balki bir doimiy hosil qilamiz. C da, uning literals (mag'lubiyat, aralash) manzilini olish mumkin - doimiy emas.
qo'shib qo'ydi muallif chux, manba
@chux va rasmiy tillar nazariyasida literal - manba kodidagi sobit qiymatni ifodalash uchun bir belgi. S standarti odatda kompyuter fanida tushunilgani kabi emas, balki constant IMO ni noto'g'ri ishlatadi.
qo'shib qo'ydi muallif PeterJ_01, manba
tamsayt xarflari umumiy foydalanishda. Menimcha, hech kim bunga aralashmaydi. Quyidagi janneb tomonidan berilgan javobni ko'ring. Boshqa bir misol tutorialspoint.com/cprogramming/c_constants.htm . en.cppreference.com/w/cpp/language/integer_literal yoki en.wikipedia.org/wiki/Integer_literal .
qo'shib qo'ydi muallif PeterJ_01, manba
Qizig'i shundaki, bu kamchilik - bu savolga nima to'g'ri kelishi mumkin, yoki ehtimol, bu qisqagina biri
qo'shib qo'ydi muallif PeterJ_01, manba