Portativ S ta'rifi

Men o'zimni go'dakka o'xshash birov bilan juda katta va qizg'in bahslarga mubtalo qildim - munozarali bu:

Mening dalillarim

  • Portable code is that which compiles with various compilers and runs exactly the same on various architectures without modification.
  • If your code depends on the sizeof(T) of an integral type, in order to keep it portable you should use the types in stdint.h like uint8_t or uint32_t
  • Most non-trivial C programs involve some level of bitwise manipulation, so everyone should know about stdint.h

Uning argumenti

  • The C standard says "Use standard types for maximum portability"
  • uint32_t etc. are not guaranteed to be present on all architectures, so don't use any of them
  • stdint.h is C99 so one should avoid it, since embedded systems may only support only C89

Mening hisoblagichim sizning turlaringizning o'lchamlarini bilmasangiz, sizning kodingiz asosan buzilgan bo'lishi mumkin va siz hatto stdint.h dan foydalanmasangiz ham, odatda aniq o'lchovli tiplarga ega bo'lgan ba'zi nom fayllari mavjud (masalan, Windows.h , UINT8 , UINT32 , DWORD va shunga o'xshashlarni bildiradi)

Menga faqatgina uint32_t dan foydalansangiz va u S standartiga muvofiq portativ bo'lmasa, men javob olaman. Agar ish vaqti xatti-harakatlari turiga qarab o'zgartirilsa, bu kod portativ emas degani emas.

Odatda, men bu ishni bajarishga ruxsat beraman, lekin bu forumda C va C ++ dasturchilarining ko'pchiligi rahbarlik qilish uchun tashrif buyuradigan forumda. Bundan tashqari, bu kishi C dasturchilarining professional murabbiyi bo'lishni talab qiladi, shuning uchun meni tashvishga soladi.

Bu odamni yana qanday qilib ishontira olaman, agar int yoki short kabi asosiy turlardan foydalansangiz, kodingiz emas /strong> portativ bo'lishi mumkinmi?

"Portativ" tushunchasiga qaytsa - u faqat turli kompilyatorlarga kompilyatsiya qiladimi yoki u tuzadigan har bir platformada xuddi shu usulni bajarish kerakmi?

Ish vaqti mobaynida muhim ahamiyatga ega deb o'ylardim - sharhlaringiz qanday?

6
Yuqorida keltirilgan to'plam yig'ilishda yordam bermaydi.
qo'shib qo'ydi muallif quickly_now, manba
" Eng ahamiyatli bo'lmagan C dasturlari bir nechta bitsel manipulyatsiya darajasini o'z ichiga oladi. " Bu ifodani shubhali deb topaman. Masalan, GUI dasturlarining aksariyati bitni manipulyatsiya qilmaydi.
qo'shib qo'ydi muallif Erdrik Ironrose, manba
Har bir API birlashtirilgan bir qator bayroqlarni ishlatadi. Bayroqlar biroz manipulyatsiya.
qo'shib qo'ydi muallif Shane Nelson, manba
Agar sizda 16 bayroq bor bo'lsa, bayroqlar o'zgaruvchisiga 16 bit kerak bo'ladi ...
qo'shib qo'ydi muallif Shane Nelson, manba
Nimaga bu gap? Siz yozgan har bir oyna dasturi oyna uslubi sifatida o'nlab bayroqni olgan CreateWindow() ga ega. fopen() va ularning birinchi bayroqlarini qabul qilish. BMP faylining sarlavhasini ajratish kabi oddiy bir narsa, ma'lumotni paketli tuzilishga o'qish kerak bo'lgan kodni oladi. Qanday qilib siz bu o'lchamdagi turlardan foydalanmasligingiz mumkin?
qo'shib qo'ydi muallif Shane Nelson, manba
Har bir API bir-biriga biriktirib qo'yilgan bayroqlardan foydalanadi. Bayroqlar bit manipulyatsiya. , boshqa shubhali iboralar. Texnik ma'noda, ALL operatsiyalari biroz manipulyatsiya.
qo'shib qo'ydi muallif Lior, manba

5 javoblar

"Orqaga qaytib ketayotganda", men 8-bitdan 64 bit platformaga ega bo'lgan kichik qurilma ma'lumotlar bazasi uchun aniq turdagi kattaliklarga muhtoj bo'lgan yuqori portativ kod yozishim kerak edi. Biz barcha parametrlarga aniq o'lchamlarni belgilaydigan kodlash standartini oldik; bu yondashuv MISRA (boshqa xayrixohliklar qatoridan) o'tishni osonlashtirdi.

Ushbu ishni bajarish uchun men o'zimning "stdint.h" ni yozdim va saqladim, chunki c89 tuzildi va standart # yoki "minalar" ni ishlatish uchun tegishli.

O'zingizning stdint.h-ni ishlatishingiz "ko'chma" bo'ladimi-yo'qmi, unda sizning maqsadingiz bo'lsa, u portativ bo'lishi mumkin. Stdint.h bo'lmasa, Cda platformadan mustaqil o'lchamli tiplar mavjud emas, shuning uchun siz "biror narsa qilishingiz kerak". Sizda int, qisqa, va hokazolar C standartidagi standartlarga ega emas va siz ulardan ma'lum bir darajada bo'lishiga asoslanib ishonsangiz, ularni portativ emas.

5
qo'shib qo'ydi

O'ylaymanki, siz ikkovingiz ham bir muammolarni isbotlash uchun harakat qilishingiz mumkin; "portativ" - bu odatiy noto'g'ri ma'lumotdir, ko'p holatlarda "taşınabilirlik" uzilishiga ega bo'lish uchun ma'lum bir platformani tark etishga hojat yo'q (har qanday yirik operatsion tizim uchun har qanday yirik yangilanishga qar.).

Sizning dalillaringiz faqat bitlarga asoslangan. Agar shunday bo'lsa, "portativlik" turli xil bit kengliklari mavjud bo'lgan arxitektura o'rtasida bo'lganda uzilishi mumkin (qarang: CHAR_BIT ).

Bundan tashqari, standartning ko'pligi (va shu bilan bog'liq bo'lgan ko'p tillar), bir narsa degan ma'noni anglatuvchi semantikaning bir qismini o'z ichiga oladi: bu implementation defined , bu avtomatik ravishda "ko'chma" emas kafolat beriladi, u mavjud bo'ladi).

Menimcha, agar siz texnikaga ega bo'lsangiz, "portativ" so'zining ma'nosini buzishingiz kerak: portga bir narsa - bu platformadan ikkinchisiga o'tish.

Agar kod port-qodir bo'lsa, unda kodni bitta platformadan ikkinchisiga hodisasiz portlab qo'yishi mumkin (ya'ni kod kutilganidek ishlaydi). Lekin bu kompilyatorni o'zgartirish kerak degani emas. Derleyici avtomatik ravishda o'zgartirilsa, endi mening kodim "port" ni hodisa ro'y bermasligini kafolatlay olmayman.

Kodni kompilyatorlar orasida kutilganidek ishlashiga kafolat berishga harakat qilsam, tizimlar orasida portativlik ni sinab ko'rmayapman, lekin moslik (C89/C99/ISO/ANSI/o'rnatilgan C, va hokazo) kodlash.

C ayniqsa, nima qilish kerakligi haqida 100% portativ emas; imkon qadar qo'shimcha qurilmalarga yaqin bo'ling.

4
qo'shib qo'ydi

Taşınabilirlik har doim ham bir qator platformalarda bo'ladi. Javob mukammal ko'chma til emas; C ni qo'llamaydigan mashinalarni qurish mumkin (yoki u sizning maqsadingizga muvofiq amalga oshira olmaydigan). Shunday qilib, portativlik masalasi har doim siz qo'llab-quvvatlagan platformalar qatoridan biri hisoblanadi.

C dan foydalanib, siz C kompilyatorlari ishlaydigan ba'zi bir platformalarni qo'llab-quvvatlaysiz. Shubhasiz. Ammo S bilan qilgan ishingiz bu yordamni toraytirishi mumkin.

Agar stdint.h da stdint.h kabi kodlardan foydalanishni istasangiz sizeof (T) > uint8_t yoki uint32_t ni tanlang

Bir turdagi o'lchamga bog'liq bo'lgan kodni yozsangiz, siz C ning o'zi kabi ko'chma kodni yozmaysiz. Sizga xabar berilganidek, uint8_t va ushbu turlar C standartida talab qilinmaydi . Har qanday S standarti bo'yicha; ular C99 va C11 ning ixtiyoriy xususiyatlari. Va C ++ 11 va undan yuqori, agar siz qiziqmoqchi bo'lsangiz.

Biroq, portativ "standartga bog'liqdir", albatta, u butunlay portativ emas. Bu turlarni qo'llab-quvvatlaydigan va qo'llab-quvvatlaydigan juda ko'p platformalar mavjud. Sizning kodingiz ushbu platformalarda portativ bo'lishi mumkin.

Siz haqingizda ogohlantirayotgan narsa, o'lchov turlariga juda ko'p ishonish emas. Siz ogohlantirayotgan narsangiz sizga turdagi kattalikdagi ishonchga ega bo'lishdir. . Sizning platformalaringizni cheklaydigan , , chunki C turi kattaliklarini aniqlamaydi. C alohida platformalar bilan ishlashga imkon beradi.

Shuning uchun tezkor 32-bitli tamsayt turiga tayanadigan kod bu kabi narsalarga ega bo'lmagan platformalarga ko'chirilmaydigan o'zining tabiatiga ko'ra dir. Bunga misol sifatida Vulkan o'zini o'zi o'zaro faoliyat platformalar grafikasi API deb hisoblaydi. Va u shunday. Lekin Vulkan, barcha turlarini stdint.h o'lchovli tamsayı turlari uchun belgilaydi. Nima uchun?

Agar platformalar ularni qo'llab-quvvatlamasa, platformasi Vulkan davrini qo'llab-quvvatlamaydi. Shunday qilib, Vulkaning V har qanday narsaga qochib ketishi mumkinligiga ishonish uchun hech qanday nuqta yo'q.

Bu noto'g'ri emas; oddiygina cheklovlaringizni kodingizning talablariga asoslanib belgilash. Siz tez-tez Vulkanga to'g'ridan-to'g'ri va ma'lumotlar strukturalarini yuborasiz va nimalarni amalga oshirishni talab qilishini talab qilishingiz kerak. Shunday qilib, sizning C platformangiz shu bilan mos keladigan turlarni qo'llab-quvvatlashi kerak.

Shu bilan birga, aniq bir ga aniq sonli aniqlik kiritadigan biror narsa qilmasangiz, int bo'lsa, aniq o'lchamli tamsayılardan foydalanib,/code> amalga oshiradi. int_leastXX_t turlari talab qilinadi va ular butun raqamlar bilan bog'liq ko'plab muammolarni hal qilishlari mumkin.

Agar siz bu kodeksni int yoki short kabi asosiy turlardan foydalansangiz, sizning kodingiz portativ bo'lmaydimi?

Ular bilan ko'chma bo'lmagan narsalarni qilsangiz, ushbu turlardan foydalanish faqat portativ bo'lmaydi.

Masalan, bit manipulyatsiyasi C kodi bilan aniqlangan. int da bitlarning aniq soni yo'q. Shunday qilib, quyidagi kod:

unsigned int i = 1 << 19;

sizeof (unsigned int) bu platforumlarda 20 bit yoki undan ortiq bo'lsa, mukammal aniqlangan .... Shunday qilib har qanday platformasi bu to'g'ri bo'lsa, yaxshi bo'ladi.

Bunga teskari:

uint32_t i = 1 << 19;

Agar platforma uint32_t ni qo'llab-quvvatlasa, faqat yaxshi kodlangan kod. Agar u o'zgacha bayt hajmiga ega bo'lsa (9 va 18 bit bittadan bayt o'lchamlari bo'lmasa) u uint32_t ni qo'llab-quvvatlamaydi. Va shuning uchun bu kod ishlamaydi. Ammo int 36 bitlik o'lchov bo'lishi mumkin, chunki u birinchi ish uchun ishlagan bo'lishi mumkin.

O'zingizni aniq o'lchamli tamsayt turlari bilan cheklab qo'ygan holda, siz o'lchamli tamsayı turlarini qo'llab-quvvatlaydigan platformalar bilan cheklanasiz. Agar siz asosiy tamsayı turlarini ishlatsangiz, siz ulardan foydalanadigan narsalar uchun bunday turdagi "etarlicha katta" platformalar bilan cheklangansiz.

Xo'sh, qaysi biri portativ? Keraksiz kattaligi etarli darajada katta bo'lgan tamsayılarga ega bo'lgan har qanday narsada (Cni qo'llab-quvvatlaydi) ustida ishlayotganda, o'lchamdagi odamning portativligi haqida gapirish qiyin. Balandligi faqatgina 32-bit tamsayılarni qo'llab-quvvatlaydigan platformalarda cheklangan bo'lsa. Ushbu kod aslida 32 bitdan foydalanmasa ham.

O'ylaymanki, ikkinchisining afzalligi shundaki, agar sizning turlaringiz qo'llab-quvvatlanmasa, siz qattiq kompilyatsiya xatolarini olasiz. Aksincha, agar int yetarli darajada katta bo'lmasa, ko'rinishdagi dasturlashtirilgan xatti-harakatlarga ega bo'lasiz. C ++ 11 bu muammoga o'zingizning tasodifiy kompilyatsiya vaqtida kompilyatsiya qilinishiga yo'l qo'yadigan static_assert bilan yechim topdi. int hajmiga kelsak, ma'lum bir foydalanish uchun etarlicha katta.

3
qo'shib qo'ydi
@NicolBolas Ba'zi Arduinolar 16-bit int s dan foydalanishadi, ATMega mikrokreditlagichlari asosida ishlaydiganlar ko'rinadi.
qo'shib qo'ydi muallif steve, manba
Siz stdint.h turini ishlatish uchun bilan bog'liq nuqta noto'g'ri tushungan ko'rinadi, agar u birinchi navbatda stdint.h ga qarshi argument bo'lgan bo'lsa. To'g'ri chiziq albatta uint_least32_t i = ((uint_least32_t) 1u) << 19;
qo'shib qo'ydi muallif TheNextStage, manba
@rep_movsd: Mana bu narsa. int32_t -ni qo'llab-quvvatlaydigan barcha platformalar 32-bit hajmdagi int turiga ega. Shunday qilib, bitta savol int32_t kompilyatsiya qilmaydigan platformalar uchun. Va ha, faqat kodni faqat 8-bit baytlardan foydalanadigan platformalarga cheklashdan ko'ra kodi int ga ega bo'lmagan platformada zarlarni almashtirmoqchiman. Boshqacha qilib aytganda, agar men shu yo'l bilan ko'chma narsalarga g'amxo'rlik qilsam.
qo'shib qo'ydi muallif Erdrik Ironrose, manba
@rep_movsd: " Siz uni maqsadli platformalarda ishlash uchun kerak bo'lgan narsani qilishingiz kerak " Lekin 100 000ga hisoblash uchun 32-bitli shart emas. Buning uchun etarli miqdor etarli. int * _t turlarini ishlatish ustidan umumiy muammo domeniga nisbatan cheklangan. C o'lchamlari uning turlari uchun qandayligini tekshirishga ruxsat beruvchi dasturni aniqlaydigan sobit turlariga ega.
qo'shib qo'ydi muallif Erdrik Ironrose, manba
@rep_movsd: Albatta, mumkin. Men bunday uskunani yoki Cni amalga oshirishni bilmayman. GCC hali 16-bitli protsessorlar uchun kompilyatsiya qiladimi?
qo'shib qo'ydi muallif Erdrik Ironrose, manba
@rep_movsd: Keyin havfsizlik tiliga o'ting. Yoki unda static_assert bilan ishlangan bir.
qo'shib qo'ydi muallif Erdrik Ironrose, manba
@rep_movsd: int ni tanlayman. Ish bilan ishlash kafolatlanganmi? Yo'q. int32_t emas, chunki kerak emas. . Shuning uchun men sizning fikringizni tushunganimga amin emasman. Bitta dastur uchun belgilangan xatti-harakatni boshqasiga sotmoqdasiz.
qo'shib qo'ydi muallif Erdrik Ironrose, manba
@rep_movsd: " Siz sobit kattalikdagi tamsayı o'zgaruvchilarga aniq sonli ma'lumotlarni o'qishingiz kerak " Nonsense. Eng kam bit bitni ushlab turadigan katta sonli integral o'zgaruvchiga bitlarning aniq sonini o'qishingiz kerak. Siz 16 bitli ma'lumotlarni 18 bitli to'liq soniyaga o'qisangiz bo'ladi.
qo'shib qo'ydi muallif Erdrik Ironrose, manba
Agar siz 100000ga qadar hisoblasangiz, 16 bitlik var kesilmaydi. Siz maqsadli platformalarda ishlash uchun kerakli narsani qilishingiz kerak
qo'shib qo'ydi muallif Shane Nelson, manba
Shunday qilib, siz stdintni takrorladingiz
qo'shib qo'ydi muallif Shane Nelson, manba
C dasturlash vositasi sifatida siz turlarning o'lchamlari haqida taxminlar qilmasligingiz kerak. Ammo amalda cheklovlar mavjud.
qo'shib qo'ydi muallif Shane Nelson, manba
Bundan tashqari, int32_t ega emas, ya'ni int 32 bit. Uzoq muddat 32 va int 16 bo'lishi mumkin
qo'shib qo'ydi muallif Shane Nelson, manba
Ish vaqti xatolar raketalarni portlatadi
qo'shib qo'ydi muallif Shane Nelson, manba
Ammo agar sizning int 16-bit bo'lsa va siz tashqariga chiqsangiz, siz aniqsiz xatti-harakatlaringiz bor edi
qo'shib qo'ydi muallif Shane Nelson, manba
Shunday qilib, kompilyatsiya qilinsa, ish vaqtida tushib qolsa ham baxtlisiz. Dasturning ajoyib usullaridan biri ekanligiga aminman
qo'shib qo'ydi muallif Shane Nelson, manba
Agar faylni BMP kabi ajralish kerak bo'lsa, siz qattiq sonli tamsayıli o'zgaruvchilarga mutanosib sonlarni o'qishingiz kerak. Portativ S bunday dasturni yozish imkoni yo'q deb aytish mumkinmi?
qo'shib qo'ydi muallif Shane Nelson, manba
Xuddi shu narsa ... 16 bitlik qiymatni o'qishni istaysiz ... Siz qanday turdagi foydalanasiz? int qisqa? uzoqmi?
qo'shib qo'ydi muallif Shane Nelson, manba

Platformada ular mavjudmi?

C + 11 va C99 dan boshlab, har bir tilning tegishli standartida aniqlangan kenglik tamsayı turlari mavjud. Raqibning birinchi argumenti mantiqiy emasligiga amin emasman.

Ular faqat ixtiyoriy. Ushbu kenglikning tabiiy tamsayı turi bo'lmasa, ular mavjud emas. Bu butunlay haqiqiy e'tiroz.

Keling, mahalliy int lazzatining 32 bit bo'lgan platforma ustida yozmoqchiman va undan keyin mahalliy 32 bitli turdagi 64 bitlik platformani maqsad qilib olasiz. Agar siz int32_t dan foydalansangiz, kodingiz kompilyatsiya qilinmaydi. Agar siz int dan foydalansangiz, u holda siz 32 bitlik taxminlarni qilmagan bo'lsangiz, u yaxshi ishlaydi. int uchun g'alaba qozonish, yana ko'chma . Boshqa tomondan, kompilyatsiya qilish eng ochiq, eng tez ko'rinadigan va dasturning muvaffaqiyatsiz bo'lishi yo'lini aniqlashning eng oson yo'li. Agar siz 32-bitlik taxminni qilsangiz va int dan foydalangan bo'lsangiz, sizda dahshatli platformalar uchun muayyan ish vaqti xatosi mavjud. Qiziqarli. int_32t uchun yutib oling.

Demak, bu savdo-sotiqdir. Bevosita kenglik tamsayılardan foydalanib, sizning kodingiz kamroq platformalarga mos keladi, ammo u ishingizdan keyin kutilganidek ishoning. Aniq bo'lmagan kenglik tamsaytlarini ishlatish u boshqa platformalarda to'planadi, ammo bu turli xil platformalarda Qo-ni ko'paytirish kerak bo'ladi. Qaysi portativlik sizning taşınabilirlik degan ma'noni anglatadi. Men sizning fikringizga qo'shilaman, chunki men xavf-xatarga qarshi emasman va tinch hayotni xohlayman.

C89?

Fair enough, you're opponent is sort of right in a very academic sense. Technically why not make it compile on K&R C. Even after C89 came out, people used to write with K&R compatibility in mind. We stopped because we didn't want to give up a lot of cool features that make code better. Imho, unless you have an known need to target old compilers, writing for C89 is insane (Writing for pre C+11 is even crazier). This is the problem with un-grounded academic conversations.

Eng ahamiyatli bo'lmagan C dasturlari ayrimlarini o'z ichiga oladi ...

Balki. Men kodning biron bir joyida eng yomon narsa qildim, deb o'ylayman, chunki xatolar yoqtirmaydi. Shuning uchun xavfsizlik uchun qattiq kenglikdan foydalanaman. Lekin C dasturlar vahshiyona farq qiladi. Hatto barcha nodavlat dasturlarda ko'rsatgichlardan foydalanish mumkin emas. Demak, bu sizni olovga olishni kutishingiz mumkin.

3
qo'shib qo'ydi
@rep_movsd: Agar yoki ni kompilyatsiya qilmasa, uni ishga tushirib bo'lmaydi.
qo'shib qo'ydi muallif Erdrik Ironrose, manba
Mening barcha dalillarim sizning kompilyatsiya qilish uchun qo'g'irchoq nuqtalarini olmaysiz, faqat sizning dasturingiz to'g'ri ishlayotgan bo'lsa, uni olasiz
qo'shib qo'ydi muallif Shane Nelson, manba
Qaysi biri yaxshi? Ishlayotgan vaqtda yoki kompilyatsiya qila olmaydigan dasturda kompilyatsiya qiladigan va amalga oshiriladigan dasturmi? Biri raketalarni uradi va ikkinchisi esa inson xatosini tortadi. Taşınabilirliği da'vo qilgandan so'ng, kodunuzun har bir satrini diqqat bilan yozilishi kerak, shunday qilib, hech qachon biron-bir platformadagi ints toshmasin! Hech qanday oqilona hisoblash uchun bunday hollarda oddiygina loopni yoza olmaysiz.
qo'shib qo'ydi muallif Shane Nelson, manba
@rep_movsd int ishlatish kabi emas, balki doimo ish vaqti xatolariga sabab bo'ladi. Mening misolimda bu sizning tavakkalchilikka asoslangan savdo-offdir. Ushbu xilma-xil me'morchilikda yorilishni xohlaysizmi yoki siz kompilyatsiya qilmoqchi emassiz. Menimcha, ikkinchisi yaxshiroq, deb o'ylayman, chunki bu katta texnik sababga ko'ra emas, balki bu pulga arzonroq variant deb o'ylayman.
qo'shib qo'ydi muallif Nathan Cooper, manba

Sizning kodingiz har qanday formatini yoki tilni aniqlashni kafolatlaydigan narsalardan tashqari tiplari haqidagi taxminlarni amalga oshirishi bilanoq uning taşınabilirliğini cheklaysiz. Agar sizning kodingiz int ob'ekti aniq 32 bit kenglikda bo'lishi kerakligini taxmin qilsa, u holda 16-raqamli tizimlar uchun 1 bit int ni yoki CHAR_BIT ning mavjud bo'lmagan tizimlari 8 va hokazo.

OTOD, agar faqat int qiymatlari [- 32767..32767] oralig'ini saqlab qolishi kerak deb hisoblasangiz, kodingiz har qanday (mos keladigan) tizim o'zgarishsiz.

Ruxsat etilgan o'lchamdagi fontlar qo'llab-quvvatlanadigan maydonchalarda hayotni osonlashtiradi, lekin ular kodingizni umuman ko'chma ga ko'chirishmaydi.

Tartibga solish

Rep_movsd uchun, bo'lim va oyatlar :

5.2.4.2.1 Sizes of integer types

1     The values given below shall be replaced by constant expressions suitable for use in #if preprocessing directives. Moreover, except for CHAR_BIT and MB_LEN_MAX, the following shall be replaced by expressions that have the same type as would an expression that is an object of the corresponding type converted according to the integer promotions. Their implementation-defined values shall be equal or greater in magnitude (absolute value) to those shown, with the same sign.
...
— minimum value for an object of type int
   INT_MIN -32767//−(215 − 1)

— maximum value for an object of type int
   INT_MAX +32767//215 − 1

...
6.2.5 Types
...
5     An object declared as type signed char occupies the same amount of storage as a ‘‘plain’’ char object. A ‘‘plain’’ int object has the natural size suggested by the architecture of the execution environment (large enough to contain any value in the range INT_MIN to INT_MAX as defined in the header ).

Ta'kidlash qo'shildi.

Ko'pchilik zamonaviy arxitektura bo'yicha int kamida 32 bit kenglikda, lekin u universal emas. Men 90-yillardayoq shu yo'l bilan chinqirib yubordim; Biz MacOS 8 va Win 3.1 da ishlaydigan kod ustida ishlaymiz. Mac-da yaxshi ishlaydigan 32-bit int kodini qabul qiladigan kodni yozdim, ammo hali ham 16-bit int ishlatilgan Windows mashinasida portladi.




  1. Meaning you can simply recompile for the new target without changing the source.
0
qo'shib qo'ydi
@rep_movsd: Tugma turlarining bit qiymatlari bilan bir qatorda bo'shliq bitlari bo'lishi mumkin, chunki int kamida 16 bit bo'lishi kerak, lekin u kengroq va faqatgina qiymatlari [- 32767..32767] ni namoyish eta oladi.
qo'shib qo'ydi muallif John Bode, manba
@rep_movsd: Standart faqat standart turdagi minimal qiymat oralig'ini saqlash uchun etarlicha katta bo'lishini belgilaydi; bu turdagi N bit bo'lishi kerak, degani emas. O'lchovlar nazarda tutilgan , eng kam intervallarni bilan, lekin aniq yozilmagan.
qo'shib qo'ydi muallif John Bode, manba
@rep_movsd: mening tahrirlashga qarang.
qo'shib qo'ydi muallif John Bode, manba
Yana bir bor aql-idrok va aql-idrokdan ustunlik. Albatta, integral turi -32767 dan 32767 oralig'ida bo'lsa, u 16 bit kenglikda bo'lishi kerak. Shubhasiz, mol-mulki shubhasizdir. Sizning arizangiz "Albatta, u 2 + 2 standartlari bilan bo'lishi kerak, lekin u 4 bo'lishi shart emas" Agar sizning turingiz qanchalik katta ekanini bilmasangiz, sizning kodingiz tabiatan aniqlanmagan. Siz ularni standartlardan yoki stdintdan olishingiz yoki o'zingizning yozishingiz bo'lsin, muhim emas. Siz qanchalar katta ahamiyatga ega ekanini bilishingiz kerak. Buni tushunish qiyinmi?
qo'shib qo'ydi muallif Shane Nelson, manba
Shunday qilib, standart ba'zi bir turdagi majburiy hajmlarni belgilaydi ... Bunday holatda argumentlar moot!
qo'shib qo'ydi muallif Shane Nelson, manba
OTOH, faqat int-qiymatlarni [-32767..32767] saqlashi kerakligini taxmin qilsangiz, sizning kodingiz o'zgarishsiz har qanday tizim uchun ko'chma bo'ladi ... Intslarda standart kafolatlar qayerda saqlanadi -32767 32767gacha
qo'shib qo'ydi muallif Shane Nelson, manba