
Október 31-én szellemek és boszorkányok járják az utcákat, december 25-én pedig a karácsonyé a főszerep. A két ünnepet jó néhány hét választja el egymástól. A programozók mégis találtak egy olyan összefüggést, amely szerint a két dátum akár egyenlő is lehet. A magyarázat egyszerűbb, mint gondolnánk – és közben a számítógépek működésének egyik érdekes sajátosságára is fény derül.
A töklámpástól a karácsonyfáig
Október végén már javában rövidülnek a nappalok, korábban sötétedik, és egyre több ablakban jelennek meg a világító töklámpások. Közeleg Halloween, a jelmezek, a szellemtörténetek és a játékos ijesztgetések ünnepe.
A Halloween eredete jóval régebbre nyúlik vissza, mint a ma ismert amerikai filmek és jelmezes partik világa. Gyökerei között megtaláljuk a kelta Samhain ünnepét, amely a betakarítás végét és a téli időszak kezdetét jelölte. Az évnek ezt az időszakát különös hiedelmek övezték, amelyekben a természet változása, a halottak emlékezete és a túlvilággal kapcsolatos elképzelések is szerepet kaptak. A Halloween elnevezés az All Hallows’ Eve, vagyis a mindenszentek előestéje kifejezésből alakult ki. A ma ismert szokások pedig különböző európai hagyományokból és későbbi, főleg észak-amerikai változásokból formálódtak.
Még a töklámpásnak is megvan a maga története. Az ír hagyományban eredetileg gyakran takarmányrépából vagy más gyökérzöldségből faragtak lámpásokat. Észak-Amerikában viszont bőven akadt sütőtök, amelyet könnyebb volt kivájni, és a mérete miatt látványosabb lámpás is készülhetett belőle.
Aztán néhány hét elteltével egészen más díszek kerülnek elő a szekrényekből.
A pókhálókat fényfüzérek váltják fel, a töklámpások helyére adventi koszorúk és karácsonyfák kerülnek. A boltokban már szólnak az ünnepi dalok, és lassan mindenki azon töpreng, milyen ajándék kerüljön a fa alá.
A karácsony keresztény ünnepként Jézus születésére emlékezik. A december 25-i ünneplésnek már a 4. századi Rómából is vannak történeti bizonyítékai, bár Jézus születésének pontos dátuma nem ismert. Az évszázadok során a vallási ünnephez számos családi és népi hagyomány kapcsolódott, a betlehemezéstől az ajándékozáson át a karácsonyfa-állításig. Magyarországon a családi ünneplés központi időpontja jellemzően december 24., szenteste, december 25. pedig karácsony első napja.
Halloween és karácsony tehát két különböző történet, két eltérő hangulat és két jól ismert dátum.
Mégis akadnak, akik szerint a kettő között matematikai egyenlőség áll fenn. – Ráadásul nem is tévednek.
Amikor a naptár és a matematika valahogyan veszekedni kezd…
A programozóknak van néhány olyan viccük, amelyeken leginkább azok nevetnek, akik már találkoztak a számítógépek sajátos gondolkodásmódjával. Nem feltétlenül azért, mert ezek különösebben bonyolultak. Inkább azért, mert egy hétköznapi kifejezés egészen más értelmet kaphat a programozás világában.
Ilyen a Halloween és a karácsony közötti furcsa kapcsolat is.
A megfejtéshez azonban előbb érdemes tisztázni valamit: a számok nem mindig azt jelentik, amire első pillantásra gondolunk. Ha például leírjuk, hogy 100, akkor szinte mindenki százra gondol. Teljesen természetes, hiszen a tízes számrendszert használjuk a mindennapokban. Ebben tízféle számjegy létezik, nullától kilencig. A helyiértékek jobbról balra haladva egyeseket, tízeseket, százasokat jelentenek.
A számítógépek világában azonban más számrendszerek is fontos szerepet játszanak.
Amikor egy szám nem annyit ér, amennyinek látszik
Ha leírom neked, hogy 100, valószínűleg százra gondolsz. De képzeld el, hogy valaki azt állítja: ez a szám valójában négyet ér.
– Nevetséges?
– Nem feltétlenül.
A mindennapi életben tízes számrendszerben számolunk. Tíz számjegyet használunk, 0-tól 9-ig, a helyiértékek pedig tíz hatványai szerint növekednek. A számítógépek világában viszont a bináris, azaz kettes számrendszernek van kiemelt szerepe:
Itt csak két számjegy létezik: 0 és 1.
A bináris 100 tehát nem százat jelent, hanem:
1 × 22 + 0 × 21 + 0 × 2⁰ = 4
A számjegyek ugyanazok, de a helyiértékek megváltoztak.

És nem csupán kétféle rendszer létezik. A programozásban gyakran találkozhatsz nyolcas és tizenhatos számrendszerrel is.
| Számrendszer | Alap | Használt számjegyek |
|---|---|---|
| Bináris | 2 | 0–1 |
| Oktális | 8 | 0–7 |
| Decimális | 10 | 0–9 |
| Hexadecimális | 16 | 0–9 és A–F |
Az eltérő jelölések önmagukban nem jelentenek hibát. A gond akkor kezdődik, amikor egy programozó vagy egy számítógépes rendszer mást feltételez egy adatról, mint amit az valójában jelent. És ez bizony nem mindig csak egy rossz eredményt okoz a képernyőn….
De miért egyenlő október 31. december 25-ével?
Most már minden szükséges ismeret rendelkezésünkre áll a programozói vicc megfejtéséhez:
Az angol October és December szavakat gyakran Oct és Dec alakban rövidítjük.
A számítástechnikában azonban:
- Az OCT az octal, vagyis nyolcas számrendszerre utal.
- A DEC a decimal, vagyis tízes számrendszert jelenti.
A felirat tehát nem egyszerűen két dátumot tartalmaz. Egy matematikai egyenlőséget állít.
Nézzük a bal oldalon szereplő 31-et, ezúttal nyolcas számrendszerben!
A 3-as számjegy a nyolcasok, az 1-es pedig az egyesek helyén áll.
318 = 3 x 8 +1 = 2510
Vagyis az oktális 31 pontosan ugyanannyit ér, mint a decimális 25. És máris érthetővé válik a programozók kérdése:
Miért keverik össze a programozók Halloweent és a karácsonyt?
Mert:
OCT 31 = DEC 25
A két ünnep persze továbbra is külön napon van. Az egyenlőség csak a számok értékére vonatkozik. Ettől természetesen még nem lehet október végén hivatalosan karácsonyozni. Bár ha valaki szeretné előbb feldíszíteni a fát, most legalább kapott hozzá egy matematikai indokot…

Próbáljuk ki Arduinóval!
Az elméleti magyarázat után nézzük meg, hogyan viselkedik ugyanez a programozási környezetben. Ehhez nem kell különösebb hardver. Egy Arduino Uno, Nano vagy más, megfelelő soros kommunikációt támogató Arduino-kompatibilis panel és az Arduino IDE elegendő. A program eredményét a soros monitoron fogjuk megjeleníteni.
Van ugyanis a C++ nyelvben egy régi szabály, amelyet az Arduino-programok írásakor is érdemes ismerni.
Ha egy egészszám-literált nullával kezdünk, a fordító oktális számként értelmezi.
Például:
1 2 | int a = 31; int b = 031; |
A két változó értéke nem azonos. Az a decimálisan 31-et, a b viszont decimálisan 25-öt tartalmaz.
A programunkban ezt a jelölést fogjuk felhasználni.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | // Halloween es karacsony - szamrendszeres kiserlet const int halloween = 031; const int karacsony = 25; void setup() { Serial.begin(9600); // Várunk, hogy a soros monitor megnyitható legyen delay(2000); Serial.println("Halloween vagy Karacsony?"); Serial.println("------------------------"); Serial.print("Oktalis szam: "); Serial.println(halloween, OCT); Serial.print("Decimalis ertek: "); Serial.println(halloween, DEC); Serial.print("Binaris alak: "); Serial.println(halloween, BIN); Serial.print("Hexadecimalis alak: "); Serial.println(halloween, HEX); Serial.println(); if (halloween == karacsony) { Serial.println("A ket ertek megegyezik!"); } else { Serial.println("A ket ertek kulonbozik!"); } } void loop() { // Itt nincs ismetlodo feladat. } |
A programot feltöltve, majd a soros monitort 9600 baud sebességre állítva a következő eredményt várjuk:
1 2 3 4 5 6 7 8 | Halloween vagy Karacsony? ------------------------ Oktalis szam: 31 Decimalis ertek: 25 Binaris alak: 11001 Hexadecimalis alak: 19 A ket ertek megegyezik! |
Érdemes megfigyelni, hogy a Serial.println() függvénynek megadható, milyen számrendszerben jelenítse meg a változó értékét.
Az OCT, DEC, BIN és HEX paraméterek a nyolcas, tízes, kettes és tizenhatos számrendszer szerinti kiírást választják ki.
A változó tényleges értéke közben nem változik. Csak a megjelenítés lesz más.
A program rövid késleltetéssel indul, hogy legyen idő megnyitni a soros monitort. Ez egyszerűbb, USB-soros átalakítót használó panelek esetén kényelmes, de nem minden Arduino-változatnál garantálja az induláskori kiírás megjelenését. Ha lemaradunk az eredményről, indítsuk újra a panelt nyitott soros monitor mellett.

Egyetlen nulla, amiből kellemetlen hibák születhetnek
A vezető nulla szerepét érdemes külön is kipróbálni, mert kezdőként könnyű megfeledkezni róla.
Tegyük fel, hogy egy programban ezt írjuk:
1 | int ido = 010; |
Talán tíz másodperces időzítést szerettünk volna megadni. A fordító azonban a 010 literált oktális számként értelmezi, amelynek decimális értéke nyolc. Ha az értéket például másodpercek számolásához használjuk, máris más eredményt kapunk, mint amire számítottunk. Ráadásul nem feltétlenül érkezik hibaüzenet, hiszen a kód teljesen szabályos.
Kicsit más lesz a helyzet, ha ezt írjuk:
1 | int ido = 019; |
Itt már fordítási hibát kapunk, mert a 9 nem használható az oktális számrendszerben.
A tanulság egyszerű: a C++-ban az egészszám-literálok leírásakor nem mindegy, milyen karakterek kerülnek a szám elé. Ez különösen akkor okozhat meglepetést, ha valaki megszokásból kétjegyű formában ad meg dátumokat, hónapokat vagy más numerikus értékeket.
- Ha például a hónap számát
08alakban próbálja egészszám-literálként megadni, az nem fog lefordulni. - Egy szövegként tárolt
"08"természetesen más eset: ott a két karakter egyszerűen szöveges adat.
Ezek a kis különbségek teszik igazán érdekessé a programozást. Amit a képernyőn szinte ugyanannak látunk, azt a fordító egészen másképpen is kezelheti. A Halloween-poén tehát egy olyan területre vezetett el bennünket, amellyel később a saját kapcsolásainkban is találkozhatunk.
Egy kis fejtörő a végére
Ha már előkerültek a számrendszerek, próbáljunk ki még három egyszerű C++-os példát.
1 2 3 | int a = 0100; int b = 0b1010; int c = 0xFF; |
Mit gondolsz, mennyi lesz a három változó értéke decimálisan?
- Az elsőnél a vezető nulla oktális jelölést jelent, így az
0100értéke 64. - A második bináris szám, vagyis
0b1010= 10. - A harmadik hexadecimális, ahol az F számjegy 15-öt ér, ezért
0xFF= 255.
Ha szeretnéd, módosítsd a korábbi Arduino-programot, és írasd ki mindhárom változó értékét a soros monitoron. Kísérletezhetsz a különböző BIN, OCT, DEC és HEX paraméterekkel is. Az ilyen rövid feladatokkal sokkal könnyebb megjegyezni a számrendszerek működését, mint pusztán táblázatokból megtanulni.
Halloween vagy karácsony? A fordító számára mindegy
A két ünnepet továbbra is külön napokon tartjuk. A töklámpás nem változik karácsonyfává, és a naptár sem ugrik előre majdnem két hónapot. A programozói poén mégis működik, mert ugyanazoknak a rövidítéseknek kétféle jelentésük lehet.
Egy egészen egyszerű matematikai összefüggésből pedig eljutottunk a számábrázoláshoz, a programozási nyelvek jelölési szabályaihoz, a hibás adatkonverziók következményeihez. Talán éppen ezért szerethetőek az ilyen szakmai viccek. A megfejtésük közben észrevétlenül tanulunk valamit.
És ha legközelebb valaki október 31-én boldog karácsonyt kíván, már érdemes gyanakodni.
Lehet, hogy egyszerűen rossz napot nézett a naptárban.

De az is lehet, hogy programozó…
Felhasznált források:
- History – History of Halloween – a Halloween története és szokásainak kialakulása.
- Encyclopaedia Britannica – Christmas – a karácsony történeti és vallási háttere.
- Arduino – Integer Constants – a különböző számrendszerekben írt egészszám-literálok.
- Arduino – Serial.print() – a számrendszer szerinti kiírás lehetőségei.
- Miért keverik össze a programozók a Halloweent és a Karácsonyt? – TavIR







