Przechowywanie zmiennej w pamięci


(radmar) #1

Witam,

chciałbym porozmawiać o reprezentacji danych w pamięci komputera. Wiemy, że mamy w C++ int. On ma domyślnie 4 bajty

4B = 4*8b = 32b

Więc potrzebujemy 32 komórki pamięci. Każda komórka zawiera po jednej liczbie 0 lub 1. (tak reprezentowane są liczby)

Więc mogę zapisać w incie maksymalną liczbę (11111111111111111111111111111111)_2 = (4294967296)_10 = 2^32

Czy dobrze to rozumiem?


(Sawyer47) #2

Standard C++ wymaga, aby int mógł przechowywać wartości od INT_MIN = -32767 do INT_MAX = 32767, więc jedyne int to minimum 16 bitów. Standard mówi również "Plain ints have the natural size suggested by the architecture of the execution environment". To co do kwestii C++. Natomiast co do kwestii ogólnych to jak najbardziej dobrze napisałeś.


(radmar) #3

Ok, to staje się to dla mnie jasne. Więc zgodnie z

u mnie może być więcej a u Ciebie mniej, ale nie mniej niż 16 (czyli 2 BAJTY). Sprawdziłem u siebie sizeofem:

int = long int = 4B

short int = 2B

long long int = 8B

zatem mogę zakodować liczbę 2^64. Załóżmy że tworzę tablicę 200 000 liczb long long intów. całość będzie mnie kosztować: (1600000 BAJTÓW). Więc około 1,6 MB

dobrze to przeliczam ?????( przyjąłem dla ułatwienia że 1MB = 1000KB oraz 1KB = 1000B)


(Sawyer47) #4

Tak, int ma minimum 16 bitów. Jeśli chce się mieć typy całkowite o określonym rozmiarze jest od tego nagłówek stdint.h / cstdint.


(radmar) #5

chodzi Ci o to żebym pisał int32_t zamiast int na przykład?

czy to pochodzi jedynie ze standardu C++0x ?


([alex]) #6

1600000 Bajtów to 1.53 MB


(Sawyer47) #7

Mówię tylko że jest coś takiego jak stdint.h, czasem trzeba dokładnie wiedzieć ile bitów ma zmienna. Wg http://en.wikipedia.org/wiki/Inttypes.h#inttypes.h to jest od C99, więc wnioskuję, że w C++ oficjalnie od C++11 (choć nie jestem pewien na 100%). Ogólnie chodzi o to, żeby wiedzieć, że w C++ typy mają określone minimalne rozmiary, natomiast jeśli chce się mieć dokładne, trzeba sięgnąć po typedefy typu stdint.h.


(Rolek0) #8

([alex]) #9
int x=12;

x|=1; // ustawiłem ostatni bit

x&=~1; // zresetowałem ostatni bit

x^=1; // zmieniłem ostatni bit na odwrotny

x|=2; // ustawiłem przedostatni bit

x&=~2; // zresetowałem przedostatni bit

x^=2; // zmieniłem przedostatni bit na odwrotny

x|=3; // ustawiłem dwa ostatnie bity

x&=~3; // zresetowałem dwa ostatnie bity

x^=3; // zmieniłem dwa ostatnie bity na odwrotne

itd.

(kostek135) #10

@[alex]

Nie, wysłałeś instrukcję do procesora, aby ten sprowadził sobie z RAM komórkę o wskazanym adresie do rejestru. W rejestrze został zmienione bity, a następnie komórka została odesłana pod wskazany adres, który jest tym samym z którego została pobrana. W efekcie tobie się tylko wydaje, że zmieniłeś je bezpośrednio. Nie wiem jakiego kompilatora używasz, ale niektóre mogą wypluć ci kod assemblerowy jeśli użyjesz odpowiedniej dla niego flagi np. dla gcc doczytałem się, że to flaga -S.