Autor Zpráva
Witiko
Profil
Mírně jsem přemýšlel a doomal nad způsobem, jakým jsou čísla reprezentovaná v paměti. Vzhledem k tomu, že maximální hodnoty čísla jsou obvykle polovina maximálního alokovatelného čísla na daný počet bitů do plusu i do minusu, napadnula mě dvojice způsobů, jakými by mohlo k ukládání číslic docházet. Pro příklady použiju formát Short int - sestávající z 8mi bitů, schopný obsahovat cifry (128; -128>

Vyhrazení jednoho bitu na znaménko
Dejme tomu, že osmý bit nejvíc vlevo by byl použit na definici znaménka, 0 - plus, 1 - minus (nebo obráceně)
Na číslo samotné by tudíš zbylo 7 bitů, tedy maximálně 127, přičemž zdvojená nula by se přiřadila k jedné ze soustav (dle konvencí k té záporné, došlo by k posunu - (-0 = -1, -1 = -2 apod.)

Porcování medvěda
Vezme se osm bitů, jež neposunuté mohou nabývat hodnot <0; 255>. Poté se určí střed (128), který se od dané číslice vždy odečte, čímž nám vzniká rozmezí (128; -128>.

S dotazem souvisí (a přivedla mě na něj) problematika NOT operace v javascriptu. Operace XOR má provést inverzi všech bitů v daném čísle. Člověk by tedy očekával, že ~1 bude 0. ~1 však navrací -2. Pokud si člověk rozepíše 2 v binární soustavě, dostane 10. Navíc tento příspěvek tvrdí, že bity předcházející číslu určují znaménko daného čísla. Dostaneme se tedy k tomu, že 00000000000000000000000000000001 (01) bylo invertováno na 11111111111111111111111111110 (-10). To ve mně vyvolává dvě zásadní otázky:

1, Až do této chvíle jsem si myslel, že reprezentace čísel v paměti je řešena dle příkladu 2 tzn. Porcováním medvěda. U 8bitových čísel totéž tvrdí i státní maturita z informatiky, do jejíž ukázkové verze jsem jednou (hledajíc povyražení) nahlédnul. Je mi tedy záhadou proč by 32bitová čísla v javascriptu používala takto znaménkový doplněk?
2, Jak prohlížeč z 11111111111111111111111111110 vyčte -2 namísto 536870910? Jak determinuje, které z bitů určují znaménko a jaké jsou již číslem (opět vycházím z tohoto příspěvku)?

Předem děkuji za odpověď. :)
jksdf
Profil
1. Je to prehľadné
2. Pokud je nejvyšší bit integeru 1, je to vždycky záporné číslo.
V tom prípade vychádzaš zle, je to citácia toho príspevku.
Witiko
Profil
Ano, cituji:
Ono to totiž není z 1000 na 0111, ale z 00001000 na 11110111 (akorát ve skutečnosti je těch bitů 32)

To mě vede k přesvědčení, že při 32 bitech dojde k inverzi z 00000000000000000000000000000001 na 11111111111111111111111111110 což nevysvětluje moji otázku jak prohlížeč pozná, které z jednotek patří k číslu a které z jednotek jsou invertované nuly patřící k znaménkovému doplňku?
11111111111111111111111111110 samo o sobě je po převodu z binární do decimální soustavy 536870910. Já to beru tak, že 30 jedniček je znaménko a 10 na konci je 2, tudíš -10, po převodu z binární do decimální soustavy -2. Jak toto ale pozná prohlížeč?
peta
Profil
"Operace XOR má provést inverzi všech bitů v daném čísle."
Inverzi provadi operace NOT.
http://www.google.cz/search?hl=cs&client=firefox-a&hs=ahw&rls=org.mozilla%3Acs%3Aofficial&q=logicke+operace+not+tabulka&aq=f&aqi=&aql=&oq=&gs_rfai=
http://cs.wikipedia.org/wiki/Logick%C3%BD_%C4%8Dlen

Na velka cisla v JS bych se nespolehal, JS neni MatLab.
Witiko
Profil
Ano, myslel jsem samozřejmě operaci not, alias bitovou negaci (~)
To však stále nevysvětluje moji otázku, viz.: [#3] a [#1]
Alphard
Profil
Witiko:
Člověk by tedy očekával, že ~1 bude 0. ~1 však navrací -2.
Nepomůže obecné Dvojkový doplněk? Jak je to v javascriptu ale vážně netuším.
Witiko
Profil
[#6] Alphard
To bude skutečně ta teorie, kterou jsem hledal, ale netušil jsem pod jakým názvem ji hledat. Děkuji moc. :)
_es
Profil
Witiko:
V JS sú v premenných všetky čísla uložené vo formáte, známom v C ako double.
Akurát niekedy JS dočasne pracuje s 32 bitovými celými číslami, ako pri tých bitových operátoroch, no výsledné číslo je aj tak vždy vo formáte double.
Davex
Profil
Jen pro upřesnění doplním, že název vlákna je hodně matoucí. Ve skutečnosti se zde bavíte o způsobu uložení čísla v registru. V paměti budou ve skutečnosti ještě bajty prohozené (alespoň na všech CPU x86, které jsou Little Endian), takže jednička bude v paměti uložena jako 00000001000000000000000000000000.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0