Uint8_t, uint_fast8_t va uint_least8_t o'rtasidagi farq

C99 standarti quyidagi ma'lumotlarni taqdim etadi. Hujjatlar AVR stdint kutubxonasi uchun bu yerda joylashgan bo'lishi mumkin.

  • uint8_t means it's an 8-bit unsigned type.
  • uint_fast8_t means it's the fastest unsigned int with at least 8 bits.
  • uint_least8_t means it's an unsigned int with at least 8 bits.

Men uint8_t ni tushunaman va uint_fast8_t nima degani (buni ro'yxatga olish darajasida qanday amalga oshirilganini bilmayman).

1. «kamida 8 bitli unsigned int » ning ma'nosi nimani anglatadi?

uint_fast8_t va uint_least8_t kodlari uint8_t ga nisbatan samaradorlikni oshiradi?

61
qo'shib qo'ydi muallif dan04, manba
uint8_t 8 bit bo'lishi kafolatlangan bo'lsa, sizning 1 savolingiz uchun uint_fast8_t = <8> bit bo'lishi kafolatlanadi, chunki unsigned char .
qo'shib qo'ydi muallif jacob, manba
Bir fikr, mahalliy 8 bitli turdagi tizimlarda uint8_t mavjud emas. Ikkinchisi esa u erda bo'ladi.
qo'shib qo'ydi muallif Pete Becker, manba
Siz "yashirin" va "ekzotik" arxitekturalarga javob berasiz. Bu atamalar biroz beg'araz. Ishonchim komilki, agar sizning tajribangiz stol tizimlarida bo'lsa, bu mimariler tajriba doirasidan tashqarida. Lekin "bundan oldin ko'rmaganman", "bu tushunarsiz yoki ekzotik" kabi emas. Katta tizim yoki DSP bilan ishlaydigan odamlar uchun bu juda keng tarqalgan.
qo'shib qo'ydi muallif Pete Becker, manba

6 javoblar

uint_least8_t is the smallest type that has at least 8 bits. uint_fast8_t is the fastest type that has at least 8 bits.

Ekzotik me'morchilikni tasavvur qilish orqali farqlarni ko'rishingiz mumkin. 20-bitli arxitekturani tasavvur qiling. unsigned int ning 20 biti (bitta reestr) va uning unsigned char 10 bitga ega. Ya'ni, sizeof (int) == 2 , lekin char turlari yordamida registrlarni yarmini kesish uchun qo'shimcha ko'rsatmalar talab qilinadi. Keyin:

  • uint8_t: is undefined (no 8 bit type).
  • uint_least8_t: is unsigned char, the smallest type that is at least 8 bits.
  • uint_fast8_t: is unsigned int, because in my imaginary architecture, a half-register variable is slower than a full-register one.
72
qo'shib qo'ydi
Ekzotik me'morchiliklarni qanday qilib ishlatish kerakligi haqida tasavvur qilishingiz kerakligini yaxshi ko'raman. Amalda biron bir foydali narsa topdingizmi?
qo'shib qo'ydi muallif Mehrdad, manba
@skyking: Har qanday arxitekturada turlari foydali bo'lsinmi yoki yo'qmi deb so'radim. Boshqacha qilib aytadigan bo'lsak, odamlar aslida ularni ishlatishadi va ularning semantikasidan arxitektura bo'yicha foyda olishadi? Yoki ular faqat changni yig'ishadimi yoki ulardan zaruriy yoki foydali bo'lmasa ishlatiladimi?
qo'shib qo'ydi muallif Mehrdad, manba
Hech kim uchun noma'lum bo'lishi mumkin edi - ilgari aytmoqchi bo'lgan narsalar quyidagi ikkita narsadir: (1) Ha, men juda ko'p sonli odamlarni ko'rdim, [u] int_ {eng oz, tezda o'zlarining kodlarida * _ t ni ishlatishadi, lekin (2) bularni amalga oshirishni hali hech kimdan ko'rmadim, chunki u ularni hipotetik emas, balki haqiqiy foyda bilan ta'minladi. Boshqacha qilib aytganda, ko'rgan vaziyatlarda, odamlar (amalda) unsigned int yoki unsigned char yoki size_t yoki nima bo'lishidan qat'iy nazar.
qo'shib qo'ydi muallif Mehrdad, manba
@DevSolar: Afsuski, aralash kodli ifodalarda kam va tezkor turlarining semantikasi umumiy tartibsizlikdir. Misol uchun, uint_least8_t x = 1 kodi x-2> 5 qiymatining nima bo'lishi kerak?
qo'shib qo'ydi muallif supercat, manba
... shuni bilamanki, ikkita komplektni ishlatmayotgan C ilovalari hech qachon 64 bit yoki undan kattaroq ishorali turni qo'llab-quvvatlamagan va bu ikkala mos kelmaydigan ikkilamchi C99 yoki C11 ilovalari hech qachon mavjud emas.
qo'shib qo'ydi muallif supercat, manba
@EuriPinhollow: Imzo qo'yilgan turlardan imzo qo'yilganga aylantirilganda, biron-bir ijobiy turdagi N har qanday ijobiy natija chiqarib, so'ng N qo'shilsa, natija majburiy bo'lsa, asl qiymati beriladi int ning 16 qiymat biti, belgining biti va 15 bitli bo'shliqqa ega bo'lganligi va unsigned </<code> uint16_t dan olinadigan -1 qiymatini belgilaydigan aniqlanmagan xatti-xarakatlarni keltiradigan uint16_t tagida 16 qiymatli va 16 bitlik bo'shliqlar mavjud edi ]. Boshqa tarafdan, ...
qo'shib qo'ydi muallif supercat, manba
@EuriPinhollow: Ilovalar uint16_t ni qo'llab-quvvatlash uchun bepul yoki uint16_t ning mavjudotini ni amalga oshirish uchun ochiqdir, lekin uint16_t a = 1 ; uint16_t -ni qo'llab-quvvatlaydigan biron bir dasturga 65535 raqamiga a ni o'rnatish uchun a "bir dastur qoidani" ni o'zboshimchalik bilan turli xil.
qo'shib qo'ydi muallif supercat, manba
@DevSolar: uint8_t bilan ikkita imzolanganligi sababli, butun son emas. Ehtimol, kamida "raqam" va "algebraik ring" turlarini ajratish foydali bo'lishi mumkin, shuning uchun unum_least8_t har qanday turdagi - imzolangan yoki imzosiz bo'lishi mumkin - bu 0-255 uwrap_least8_t qo'shilsa, qo'shilsa, subtadli, ko'paytirilsa va hokazo. kiritadigan biror narsaga yordam beradigan tip bo'lsa, pastki 8 biti xuddi operatsiya 8-bitli turdagi bajarildi.
qo'shib qo'ydi muallif supercat, manba
int_fast32_t siz ishonadigan vaziyatlar uchun odatda int dan foydalanishingiz mumkin, lekin 16-bitli platformada
qo'shib qo'ydi muallif M.M, manba
9-bitli baytli mashinalar kabi ekzotik arxitektura bularni tushunishga yordam beradi. (Ayni paytda, kamida bitta tarqalgan ESP 9 bit bayt va registrlarda 36 bitlik "so'zlar" mavjud, qo'shimcha bitlar ortiqcha/to'yinganlikni oldini olish uchun saqlovchi bitlar sifatida ishlatiladi va ular xotirada saqlanganida tashlanadi)./Ammo, bu 32-bit reg-reg ko'rsatmalari bilan keng tarqalgan RISC-lar uchun ham amal qiladi. uint8_t har bir uint8_t operatsiyasidan so'ng, masalan, AND yoki do'kon -byte/load-byte tomonidan qisqartirishni talab qiladi. O'ylaymanki, uint_fast8_t ba'zan qisqartirilishiga, ba'zan esa, o'lchamsiz (uint8_t) == sizeof (uint_fast8_t) deb hisoblayman.
qo'shib qo'ydi muallif Krazy Glew, manba
@supercat: "Tugallanmagan tog 'oqimlari/seysmik semantikaga tayanmang, imzosiz yoki emas"?
qo'shib qo'ydi muallif DevSolar, manba
@Mehrdad: afzalligi kontekstda. Agar siz unsigned int ni yozsangiz, nima uchun ni ishlatganingiz ni yozgansiz (boshqa birov emas). Buning sababi aniq 32 bit yoki kamida 32 bit bo'lishi mumkinmi? Yoki bu "eng tezkor" tipmi? ( sizning platformasida ...) Men - bu xizmat kodatori sifatida - unsigned int dan foydalanishda niyatlaringizni bilmayman va shubhalanaman kontekstda noto'g'ri turdagi bo'lishi (va shuning uchun men ovchilikda xato uchun javobgar). uint_least32_t ni yozgan bo'lsangiz, niyatingiz aniq va sizning varsayımlarınızın to'g'ri/yo'qligini tekshirish mumkin.
qo'shib qo'ydi muallif DevSolar, manba
@plugwash: x , ajralmas qismini substraksiyondan oldin targ'ib qilinadi, shuning uchun uning turi int bilan bir xil bo'lsa, u unsigned int ga kiritiladi va natijasi to'g'ri bo'ladi. Agar u kichik bo'lsa, u int ga tarjima qilinadi va natijada noto'g'ri bo'ladi.
qo'shib qo'ydi muallif rodrigo, manba
@skyking: Ular nazariy jihatdan foydali. Lekin men atrofida bir necha OS mashhur dasturlari va kutubxonalarining manba kodi orqali tezkor grep qildim va ushbu turlardan faqat foydalanish stdint.h nusxasida joylashgan. Va bu nom faqat uintX_t bo'lganlar uchun talab qilinadi.
qo'shib qo'ydi muallif rodrigo, manba
@skyking: Men ularni amalda juda ko'p ishlatilmayotgani uchun ishlatmaslik kerakligini aytmayman. Agar haqiqiy dunyo dasturini yoki kutubxonani mantiqiy ravishda topadigan bo'lsa, unda siz linkni joylashtirasiz, chunki hech qanday topolmadim.
qo'shib qo'ydi muallif rodrigo, manba
@Mehrdad: Haqiqiy dunyo ilovalarida ishlatiladigan uint_leastX_t yoki uint_fastX_t ni ko'rmaganman. uintX_t Ha, ular juda ishlatiladi. Odamlar ekzotik mimarlara ko'chib o'tishda juda qiziq emas. Kutilmagan natija, hatto siz imzo chekuvchilaringizni ham to'g'ri qabul qilsangiz ham, dasturingiz minglab turli xil narsalarda muvaffaqiyatsiz bo'ladi.
qo'shib qo'ydi muallif rodrigo, manba
@ M.M: Ruxsat etilgan, rahmat.
qo'shib qo'ydi muallif rodrigo, manba
@Mehrdad: ... va agar siz ekzotik me'morchilik uchun dasturiy qilmoqchi bo'lsangiz, u holda siz turlaringizni bilasiz, siz boshqa kompyuter uchun foydali kodni yozishni istamaysiz, shuning uchun sizga ko'chma ma'lumotlar haqida qayg'urmaysiz.
qo'shib qo'ydi muallif rodrigo, manba
@rodrigo Nima uchun portativlik haqida qayg'urmaslik kerak? Mening tajribam shuni nazarda tutadiki, oddiy arxitekturalardagi odamlar bir oz farq qiladigan har bir platformaning "singan" ekanligini va uni int haqida ko'rsatgichni ushlab turish uchun mos kelmasligini taxmin qilish moyilroq.
qo'shib qo'ydi muallif skyking, manba
@Mehrdad Men buni juda foydali deb bilaman, hech bo'lmaganda * int_least * _t va uint_fast * _t . Ularning mavjudligi kafolatlanadi va belgilangan oraliqlarga ega bo'lish kafolatlanadi - bu kod aslida portativ bo'ladi. Albatta, int_least32_t o'rniga int_least16_t o'rniga int va long o'rniga int bu 16 bit o'rniga 32-bitli 32-bitli raqamlarni ishlatadi, bu erda 16-bit mavjud yoki 32-bit o'rniga 32 bitli o'rniga 64-bitli raqamlar mavjud).
qo'shib qo'ydi muallif skyking, manba
@rodrigo Darhaqiqat, nazariyada, butunlay to'lib toshish bilan shug'ullanish kerak, ammo amalda dasturchilar bularning amalga oshmagani (keyinchalik yuz berishi kerak emas Y2K) deb hisoblaydi.
qo'shib qo'ydi muallif skyking, manba
Masalan, @Mehrdad MIPS bironta uintX_fast_t ni 32 bitdan kamroq qilish to'g'ri bo'lmaydi. uint8_t ni olish uchun mimariyi tasavvur qilishning hojati yo'q, misol uchun, 36-bitlik UNIVACni qabul qilsangiz, u erda char bit.
qo'shib qo'ydi muallif skyking, manba
"Masalan, uint_least8_t x = 1 bo'lsa, x-2> 5 qiymatining qiymati qanday bo'lishi kerak?" 1 char char int yana kichik bo'lsa int% bilan bir xil o'lchamda bo'lsa.
qo'shib qo'ydi muallif plugwash, manba
@Mehrdad ARM da, masalan, agar int_fast8_t 32-bitli o'zgaruvchi bo'lsa, arifmetik operatsiyalardan oldin imzo kengaytmasini bajarishga hojat yo'q.
qo'shib qo'ydi muallif user694733, manba
qo'shib qo'ydi muallif user694733, manba
@supercat siz haqsiz, standart aslida shunday deb aytadi: eel.is/c++draft /conv.integral#2 ga qaramay, faqat ikkita komplektga ruxsat berilmaydi.
qo'shib qo'ydi muallif Euri Pinhollow, manba
uint yozsangiz @supercat [ANY] _t a = 1; a-2; siz dasturni aniqlagan xatti-harakatlaridan foydalanmoqdasiz va standartda aniq ko'rsatib o'tilgan.
qo'shib qo'ydi muallif Euri Pinhollow, manba
@merhad: Men har bir narsa uchun faqat 32 bit qiymatga ega bo'lgan CPU bilan ishladim. (Aslida 40 bit, lekin kompilyator hamma narsani 32 bit qiymatga aylantirdi), shuning uchun uint8_t yoki uint16_t yo'q edi, lekin uint32_t va barcha uint_least * va uint_fast * turlari uint32_t bilan bir xil edi. Bu ADSP SHARC edi. Hozirgi loyihamda biz tez va eng kichik turlardan ko'p foydalanmoqdamiz.
qo'shib qo'ydi muallif Florian Keßeler, manba

uint8_t means: give me an unsigned int of exactly 8 bits.

uint_least8_t means: give me the smallest type of unsigned int which has at least 8 bits. Optimize for memory consumption.

uint_fast8_t means: give me an unsigned int of at least 8 bits. Pick a larger type if it will make my program faster, because of alignment considerations. Optimize for speed.

Bundan tashqari, oddiy int turlaridan farqli o'laroq, yuqorida ko'rsatilgan stdint.h turlarining imzolangan versiyasi 2 komplement formati bo'lishi kafolatlanadi.

21
qo'shib qo'ydi
@Lundin: Har qanday kompilyator, ehtimol, "int32_t" va "uint32_t" ni "int" va "unsigned int", yoki "uzoq" va "unsigned long" deb belgilaydi. Muammo shundaki, "int" va "long" har ikkala 32 bit bo'lgan platformalarda, "int32_t" ning bir o'lcham yoki boshqasi bo'lishini kutishning alohida sababi yo'q. Agar bir nechta katalogni * int , * long va * int32_t ishlatadigan kutubxonalarga o'tkazib yuborsa, bitta qatorni moslash uchun hech qanday usul yo'q barcha uchta hatto uchta turdagi bir xil o'lcham va vakolatga ega bo'lgan platformalarda ham mavjud .
qo'shib qo'ydi muallif supercat, manba
@Lundin: Ba'zi derleyiciler int32_t uchun typedef sifatida "uzoq" va ba'zilari "int" dan foydalaning. "Int" va "long" ning bir xil vakolati bo'lsa ham, ular (va ba'zan) C ning aliasing qoidalari uchun alohida deb hisoblanishi mumkin.
qo'shib qo'ydi muallif supercat, manba
@ legends2k: stdint.h ning turlari, agar ular ko'chma kod yozishni istasa, unchalik foydali emas, chunki ular ikkitomonlama komplekt saqlash formatini qo'llashlari kerak, ammo buning ma'nosi ular ikki tomonlama qo'shimcha mahsulotni namoyish qilishadi. int32_t * yordamida kod yozib, int * yordamida int /code>, yoki aksincha, ishlash uchun kafolat bo'lmaydi.
qo'shib qo'ydi muallif supercat, manba
Rahmat. stdint.h da imzolangan fontlar ikkita qo'shimcha bo'lishi kafolatlanganligini bilish yaxshi. Portativ kod yozishda qaerga yordam berishi mumkinligini o'ylab ko'ring.
qo'shib qo'ydi muallif legends2k, manba
@supercat Derivatorning har bir takrorlanadigan ishlov berish bilan ziddiyatga olib keladigan turi sifatida yozish uchun juda achinarli emasmi? Faqatgina platformalar mustaqil kompilyatorlari uchun (GCC) muammolar kabi ko'rinadi, bu erda ma'lum bir qurilma uchun kompilyator porti ko'rsatkichni takrorlashni qanday bajarishni nazorat qilmaydi?
qo'shib qo'ydi muallif Lundin, manba
@supercat Men ko'rgan har bir kompilyator, asosiy "kalit so'z" tamsayı turlaridan biri bilan sinxronlashtirish uchun stdint.h turlari uchun ichki tipedefdan foydalangan. Shunday qilib, agar siz pointerni takrorlashdan xavotirlansangiz, men bu amaliyotda faqat nazariy muammodir deb o'ylamayman.
qo'shib qo'ydi muallif Lundin, manba
2 komplekt formatini ishlatish uchun faqat aniq kenglik varianti talab qilinadi. Bundan tashqari, ularning mavjud bo'lishi shart emasligini ham unutmang. Natijada, platforma 2 komplement formatini qo'llab-quvvatlamaydi.
qo'shib qo'ydi muallif skyking, manba

Nazariya shunga o'xshash narsadir:

uint8_t is required to be exactly 8 bits but it's not required to exist. So you should use it where you are relying on the modulo-256 arithmetic behaviour of an 8 bit integer and where you would prefer a compile failure to misbehaviour on obscure architectures.

uint_least8_t is required to be the smallest available unsigned integer type that can store at least 8 bits. You would use it when you want to minimise the memory use of things like large arrays.

uint_fast8_t is supposed to be the "fastest" unsigned type that can store at least 8 bits; however, it's not actually guaranteed to be the fastest for any given operation on any given processor. You would use it in processing code that performs lots of operations on the value.

Amaliyot shuni anglatadiki, "tez" va "eng kichik" turlari juda ko'p qo'llanilmaydi.

ChAR_BIT! = 8 yordamida arxitekturalarni yashirish uchun portativligi haqida g'amxo'rlik qilsangiz, "eng kichik" turlar juda foydali.

"Tez" turlari bilan bog'liq muammo "eng tezkor" ni pin qilish qiyin. Kichikroq turdagi xotira/kesh tizimida kamroq yuk bo'lishi mumkin, ammo mahalliydan kichikroq turdagi qo'shimcha ko'rsatmalar talab qilinishi mumkin. Bundan tashqari, eng yaxshi bo'lgan arxitektura versiyalari orasida o'zgarishi mumkin, ammo amaliyotchilar ko'p hollarda ABI ni buzishdan qochishadi.

Ba'zi mashhur ilovalarni ko'rib chiqishdan ko'rinib turibdiki, uint_fastn_t ning ta'riflari juda ixtiyoriy. glibc, ularni eng kamida, bu tizimning "ona tili o'lchami" deb ta'riflaydi, shuning uchun ko'plab zamonaviy protsessorlarning (ayniqsa, 64-bit) o'zlarining mahalliy so'zlaridan kichikroq narsalar bo'yicha tezkor operatsiyalarni qo'llab-quvvatlashi hajmi. IOS, ularni qat'iy o'lchamli turlarga teng deb belgilaydi. Boshqa platformalar farq qilishi mumkin.

Eng muhimi, kichik tamsayılar bilan qattiq kodni bajarish sizning maqsadingiz eng yaxshi ishlarni ko'rish uchun siz turli o'lchamli turdagi parvarishlash maydonchalaridagi sizning kodini kursatishingiz kerak.

20
qo'shib qo'ydi
@zwol: Tilga tartib va ​​semantik talablar, misol uchun. "Menga pastki bitlar boshqa 16-bitli turlarni kiritishi kerak bo'lgan va 0-65535 qadriyatlariga ega bo'lgan narsaga muhtojman, lekin u oraliqqa katta qiymatlarni kiritish uchun menga kerak emas". Aliasing, joylashtirish, intervalli va tashqaridan bo'lmagan harakat bir turdagi to'rtta alohida jihati bo'lishi kerak, lekin C faqat turli xil platformalar orasidagi izchil kombinatsiyalarga ruxsat beradi.
qo'shib qo'ydi muallif supercat, manba
glibcning ta'riflari ushbu optimallashlar mavjud bo'lmagan paytda tanlangan va ular endi ABIga pishirilgan va o'zgartirilishi mumkin emas. Bu _least va _fast turlarining amaliyotda foydali bo'lmasliklarining bir necha sabablaridan biridir.
qo'shib qo'ydi muallif zwol, manba

Ayrim protsessorlar katta hajmdagi kichik ma'lumot turlarida samarali ishlashi mumkin emas. Misol uchun, berilgan:

uint32_t foo(uint32_t x, uint8_t y)
{
  x+=y;
  y+=2;
  x+=y;
  y+=4;
  x+=y;
  y+=6;
  x+=y;
  return x;
}

agar y uint32_t bo'lsa, ARM Cortex-M3 uchun derleyici oddiygina ishlab chiqarishi mumkin

add r0,r0,r1,asl #2   ; x+=(y<<2)
add r0,r0,#12         ; x+=12
bx  lr                ; return x

lekin y uint8_t bo'lgani uchun, derleyici buning o'rniga ishlab chiqarish kerak bo'ladi:

add r0,r0,r1          ; x+=y
add r1,r1,#2          ; Compute y+2
and r1,r1,#255        ; y=(y+2) & 255
add r0,r0,r1          ; x+=y
add r1,r1,#4          ; Compute y+4
and r1,r1,#255        ; y=(y+4) & 255
add r0,r0,r1          ; x+=y
add r1,r1,#6          ; Compute y+6
and r1,r1,#255        ; y=(y+6) & 255
add r0,r0,r1          ; x+=y
bx  lr                ; return x

"Tez" turdagi maqsadlar kompilyatorlarga tezroq ishlashi mumkin bo'lmagan kichik turlarni almashtirish imkonini berdi. Afsuski, "tezkor" turdagi semantika juda kam belgilanadi, bu esa o'z navbatida imzolarni imzo qo'yilgan yoki imzolangan matematikadan foydalanib baholanadigan savollarni qoldiradi.

4
qo'shib qo'ydi
@Galaxy: Afsuski, standart "kontrast" ga qarab o'zgarishi mumkin bo'lgan "eng kichik" turlarga imkon bermaydi. Masalan, ro'yxatga olingan 32-bit qiymatlardagi arifmetik yozuvlar 8-bitli qiymatlarni ro'yxatdan o'tkazishda ishlatishdan ko'ra tezroq bo'lishi mumkin, lekin 8-bitlik yuklamalar va do'konlar 32 bitli yuk va do'konlar bilan bir xil tezlikda bo'ladi va keshlash muammolar 8-bitli qiymatlarni yanada samarali bo'lishiga olib kelishi mumkin.
qo'shib qo'ydi muallif supercat, manba
Kichikroq ma'lumotlar turini qo'llashda kerak bo'ladigan qo'shimcha keraksiz yo'riqnomalar mahalliy so'z hajmining kattaroq ma'lumot turiga va boshqalarga nima sababdan "tezkor" ma'lumotlar turlarining ko'pchiligi kutilganidan kattaroq bit kengligi bo'lishi mumkinligini ko'rsatishning uzoq yo'lidir. Sizning namunangiz uchun rahmat.
qo'shib qo'ydi muallif Galaxy, manba

1. "Eng kamida 8 bit bilan imzosiz int" ning ma'nosi nimani anglatadi?

Bu aniq bo'lishi kerak. Bu unda ishlamaydigan tamsayı turi va uning kengligi kamida 8 bit ekanligini bildiradi. Aslini olganda, u 0 dan 255 gacha raqamlarni ushlab turishi va salbiy sonlarni ushlab turishi mumkin emas, ammo u raqamlarni 255 dan yuqori darajada ushlab turishi mumkin degan ma'noni anglatadi.

Agar siz 0 dan 255 gacha bo'lgan har qanday raqamni saqlashni rejalashtirmoqchi bo'lsangiz, ushbu turlardan hech birini foydalanmasligingiz shubhasiz (va siz portativ bo'lishni xohlaysiz).

uint_fast8_t va uint_least8_t uint8_t bilan taqqoslaganda samaradorlik/kod maydonini oshirishga yordam beradi?

uint_fast8_t is required to be faster so you should use that if your requirement is that the code be fast. uint_least8_t on the other hand requires that there is no candidate of lesser size - so you would use that if size is the concern.


Va, albatta, to'liq 8 bit bo'lishi shart bo'lganingizda, faqat uint8_t foydalanasiz. uint8_t dan foydalanish kodni ko'chirib olishni talab qilmaydi, chunki uint8_t mavjud emas (chunki bunday kichik tamsayı turi ma'lum platformalarda mavjud emas).

4
qo'shib qo'ydi

"Tez" tamsayı turlari eng kam miqdorda kerak bo'lgan bit miqdori bilan mavjud bo'lgan eng tezkor tamsayı deb ta'riflanadi (sizning ishingizda 8).

Agar platforma uint_fast8_t ni uint8_t deb belgilashi mumkin bo'lsa, unda tezlikda hech qanday farq bo'lmaydi.

Buning sababi, mahalliy so'z uzunligini ishlatmaslikda sekinroq bo'lgan platformalar mavjudligi.

3
qo'shib qo'ydi