Obliczanie adresu w pamięci RAM

0

Hej. Mam pamięć RAM (to czysto teoretyczne zadanie) adresowaną od 0x300000000 do 0x900000000 czyli 3GB. Chcę na jej koniec wrzucić blok z danymi o wielkości 256 MB = 2147483648 b. Jak obliczyć, w jakim miejscu w mojej pamięci będzie zaczynał się blok danych o rozmiarze 256? Ma zaczynać się w adresie X (do wyznacznia) i kończyć w adresie 0x900000000 czyli na "końcu" pamięci.** Nie stosuję (nie muszę w zadaniu) żadnych offsetów, itp.**

Myślałem, żeby zrobić to tak:

0x900000000 (HEX) = 38654705664 (DEC) i wtedy od 38654705664 (DEC) odejmuję 2147483648 ... czyli

38654705664 - 2147483648 = 36507222016 i zamieniając na HEX mam adres 0x880000000.

Tylko czy aby na pewno to jest ok?

0

Bez zbędnego kombinowania:
0x900000000 - 0x10000000 = 0x8F0000000

0

Czyli wystarczy, że:

  1. zamienię 256 MB na bajty, to jest 268435456 B
  2. odejmę od 38654705664 (adresu końcowego w postaci DEC) wartość 268435456 i wynik zamienię na postać szesnastkową

Co do tego, co kolega Łukasz podawał, mam pewne problemy, mianowicie robię tak (liczę w Windowsowym kalkulatorze, przestawiłem sobie na Hex):

  1. zamieniam 256 MB na bajty, to jest 268435456 B
  2. zamieniam 268435456 B na Hex, to mi daje 0x10000000
  3. odejmuję: 0x90000000 - 0x10000000 co daje mi w kalkulatorze 80000000 ??

Jesycye zapytam o "odwrotną" sytuację. Mam początek pamięci, czyli u mnie 0x300000000. Chcę wstawić blok o rozmiarze 256 i obl adres jego końca w pamięci, czy wtedy dobrze myślę, że powinienm zrobić tak:

  1. zamienię 256 MB na bajty, to jest 268435456 B
  2. dodaję do 12884901888 (adresu początkowego w postaci DEC) wartość 268435456 i wynik zamieniam na postać szesnastkową ?
0
ja_jacek napisał(a):
  1. odejmuję: 0x90000000 - 0x10000000 co daje mi w kalkulatorze 80000000 ??
    Nie 0x90000000 tylko 0x900000000.

Jesycye zapytam o "odwrotną" sytuację. Mam początek pamięci, czyli u mnie 0x300000000. Chcę wstawić blok o rozmiarze 256 i obl adres jego końca w pamięci, czy wtedy dobrze myślę, że powinienm zrobić tak:
Tak

0

Rzeczywiście; umknęło mi gdzieś zero:) Dziękuję serdecznie za pomoc, pozdrawiam!

1

Nie, nie korzystaj z systemu dziesiętnego. Licz w systemie szesnastkowym/dwójkowym, liczby będą okrągłe i nie będziesz musiał używać kalkulatora (taki może być wymóg na kartkówce/sprawdzianie jeśli jest to szkolne zadanie).

256 MB zamieniamy do postaci 2^N B czyli
256 MB = 256 * 2^20 B = 2^8 * 2^20 B = 2^28 B
teraz do postaci 16^N B czyli
<code>2^28 B = (2^4)^7 B = 16^7 B</code>
czyli siedem zer w zapisie szesnastkowym
16^7 B = 0x10^7 B = 0x10000000 B

następnie odejmujemy

  0x900000000
- 0x010000000
----------------
= 0x8F0000000

analogicznie druga część zadania:

  0x300000000
+ 0x010000000
----------------
= 0x310000000
0

A możesz wyjaśnić, dlaczego nie korzystać z dziesiętnego? Jakoś tak łatwiej mi już to w ten sposób liczyć, jak wcześniej kolega podał. Czy ten wczesniejszy sposob tez jest poprawny?czy jak mowisz, nie uzywac go?

Tak, to szkolne zadanie:)

0

256 MB zamieniamy do postaci 2^N B czyli
256 MB = 256 * 220 B = 28 * 220 B = 228 B
teraz do postaci 16^N B czyli
228 B = (24)7 B = 167 B
czyli siedem zer w zapisie szesnastkowym
167 B = 0x107 B = 0x10000000 B
skomplikowane masz te obliczenia ;-)

ile (w hexach) to jest kilobajt?
1024 = 4 * 256 = 4 * 16 * 16
16d to 10h, mnożenie przez szesnaście to dodanie zera:
256d = 16d * 16d = 10h * 10h = 100h
kilobajt ma cztery takie 256-ki, czyli
1024d = 4d * 256d = 4h * 100h = 400h
megabajt to 400h podniesione do kwadratu, czyli
4 00h * 4 00h = 10 00 00h(ilość zer się sumuje, a 4*4 daje 10 zamiast 16)
skoro 1MB to 100000h B, to 256 MB to dodanie dwóch zer (256d=100h): 10000000h

wszystko to na „chłopski rozum”, z czego większość można pamiętać albo zrobić w głowie, nie trzeba rozpisywać potęg :-)

0

Może mój zapis jest trochę rozciągnięty, ale poszczególne kroki liczy się prosto. Łatwo jest zamienić ilość bajtów na postać wyrażoną jako potęga dwójki. kB to 10-ta potęga, MB to 20-ta, GB 30-ta itd. Stąd prosto:
256 MB = 228 B bo mamy 20 mnożeń z MB + 8 mnożeń z liczby 256 (256 to 28). Proste?
Dopiero teraz zamieniamy na hex, 228 to 167 (każda cyfra hex to 4 bity) czyli 0x10000000. Proste?

Twój sposób opiera się na zamianie jednostek kB/MB/GB od razu na hex (kB=0x400, MB=0x100000, Gb=40000000 ...) co nie jest sprawą tak oczywistą i natychmiastową jak użycie do tego celu potęgi liczby 2 :) . Ale mimo wszystko i tak prosto ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1