Autor | Zpráva | ||
---|---|---|---|
Witiko Profil |
#1 · Zasláno: 17. 9. 2010, 14:46:38 · Upravil/a: Witiko
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 |
#2 · Zasláno: 17. 9. 2010, 15:44:38
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 |
#3 · Zasláno: 17. 9. 2010, 15:53:12 · Upravil/a: Witiko
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 |
#4 · Zasláno: 17. 9. 2010, 15:56:02
"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 |
#5 · Zasláno: 17. 9. 2010, 16:02:12 · Upravil/a: Witiko
|
||
Alphard Profil |
#6 · Zasláno: 17. 9. 2010, 16:03:43
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 |
#7 · Zasláno: 17. 9. 2010, 16:15:21
[#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 |
#8 · Zasláno: 17. 9. 2010, 18:03:40
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 |
#9 · Zasláno: 17. 9. 2010, 19:58:39
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.
|
||
Časová prodleva: 14 let
|
0