O Nowym Roku informatycznie
Wszystkiego dobrego w Nowym 3744 oraz 7E4 roku.
ZAPIS | ||
---|---|---|
16 | 10 | 2 |
0 | 00 | 0000 |
1 | 01 | 0001 |
2 | 02 | 0010 |
3 | 03 | 0011 |
4 | 04 | 0100 |
5 | 05 | 0101 |
6 | 06 | 0110 |
7 | 07 | 0111 |
8 | 08 | 1000 |
9 | 09 | 1001 |
A | 10 | 1010 |
B | 11 | 1011 |
C | 12 | 1100 |
D | 13 | 1101 |
E | 14 | 1110 |
F | 15 | 1111 |
Pewnie wielu się zdziwi, ale bardziej zaawansowani informatycznie stwierdzą – a to informatyczny żartowniś – przecież to rok 2020 w zapisie ósemkowym oraz szesnastkowym (heksadecymalnym). Ale też trzeba przyznać, ze ten Nowy rok dobrze się prezentuje w zapisie dziesiętnym 2020. Następny taki będzie w roku 2121.
Dla mniej wtajemniczych w przykład pokazujący zasadę tego zapisu:
zapis liczby 37448 o podstawie ósemkowej:
3*83 +7*82 +4*81 +4*80 = 202010
zapis liczby 202010 o podstawie dziesiętnej:
2*103 +0*102 +2*101 +0*100 = 202010
zapis liczby 7E416 o podstawie szesnastkowej:
7*162 +14*161 +4*160 =202010
Teraz popatrzmy w przyszłość na Sylwestra roku 204710 czyli 37778 lub 7FF16.
Co się pokaże na tych licznikach o godzinie 23:59, 24:00 albo 00:00, 00:01 ?
11:59 204710 37778 7FF16
12:00 204810 40008 80016
[Uwaga: Zadałem sobie pytanie, który mamy rok w chwili wybicia godziny 12:00 w noc sylwestrową - stary czy już nowy? Okazuje się, że ta pełna godzina 24:00, pokazywana na zegarkach cyfrowych jako 00:00 jest jeszcze północą dnia dotychczasowego, a więc również dnia starego roku, ale też jest ona północą nowego dnia, czyli dnia nowego roku. Czyli przez moment mamy i Stary i Nowy Rok? Chyba jednak pierwsze uderzenie zegara należy do Starego Roku, a następne już wykonywane w kolejnych sekundach nowego dnia należą do Nowego Roku. I tego powinniśmy się trzymać otwierając szampana!]
Ach, jakie to ładne liczby – 2048, 4000 i 800.
Ale w rejestrach i słowach pamięci komputera są one zapisywane o podstawie dwójkowej, binarnie, zerojedynkowo, przy czym bardzo łatwo uzyskać taki zapis z postaci ósemkowej oraz szestnastkowej:
0 | 7 | F | F | ||||||||||||
0 | 0 | 3 | 7 | 7 | 7 | ||||||||||
0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
po dodaniu do tego rejestru 1 otrzymamy: | |||||||||||||||
0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
czyli zapis roku 2048 !
Czy coś nam grozi z tego powodu?
W zasadzie nie, chyba że jakiś żartowniś z racji tak pięknej informatycznie zmiany roku dopisze kod złośliwie oznajmujący ten niecodzienny osobliwy informatycznie fakt. Bo przecież na naszej osi czasu podobna sytuacja mogła się zdarzyć w Sylwestra 1023 roku (wtedy nie było komputerów) i może się zdarzyć dopiero w 4097 roku – a więc poza naszym pobytem na tym świecie. Również w kalendarzu hebrajskim, gdy mamy dzisiaj 5779 rok oraz muzułmańskim gdy mamy 1440 rok nie ma takich szans.
Ale, ale – problem może stać się poważny, gdyby komputer wykorzystywał słowa 12-bitowe, a nie jak obecnie co najmniej 16-bitowe do zapisu roku w postaci liczby całkowitej. Takich komputerów – np. PDP-8, PDP-12, CDC6000 używaliśmy do połowy lat 90-tych. Jednakże możemy mieć problem ze sterownikami (aktywnymi elementami internetu rzeczy), z których wiele korzysta ze słów 12-bitowych w przetwarzaniu i sterowaniu sygnałami. Dlaczego?
Popatrzmy, że przy słowach 12-bitowych deklaracje typów i zmiennych np. w języku C: opisują:
short integer numer_roku ;
- może zawierać liczby całkowite od -212 do 212-1 czyli z przedziału -2048..2047 co oznacza, że nie można w niej zapisać liczby większej od 2047, a więc również roku 2048.
Można to poprawić deklarując:
unsigned short integer numer_roku;
moze zawierać liczby naturalne od 0..4095, a więc również rok 2048 (ale nie wystarczy to do zapisania roku według kalendarza hebrajskiego – trzeba wtedy zadeklarować unsigned integer numer_roku_hebrajski; co zajmie dwa słowa 12-bitowe ).
Trochę przypomina to problem roku 2000, ale tylko w odniesieniu do nieznanej liczby 12-bitowych sterowników (można je zakupić również dzisiaj i używać w instalacjach internetu rzeczy) i to wtedy, gdy programiści nie zauważyli tych ograniczeń w przyszłości i może to mieć znaczenie dla poprawnego funkcjonowania sterownika.
Ale dzisiaj w Sylwestra 2019 roku na 1022710 dni przed Sylwestrem 2047 roku nie powinniśmy się tym ciekawym problemem martwić, ale się dobrze bawić.
Ps. Przyznaję się, że jest to mutacja wpisu z zeszłego roku, ale jakże ciekawa.