2014-06-13 6 views
56

manpage mówi o memset:W jaki sposób zestaw danych inicjalizuje tablicę liczb całkowitych przez -1?

#include <string.h> 
void *memset(void *s, int c, size_t n) 

Funkcja memset() wypełnia pierwszą nbajtów obszaru pamięci wskazywanego przez s ze stałą bajt c.

Jest oczywiste, że memset nie może być używany do inicjalizacji int tablicy, jak pokazano poniżej:

int a[10]; 
memset(a, 1, sizeof(a)); 

to dlatego int reprezentuje 4 bajty (powiedzmy) i nie można uzyskać pożądany wartość dla liczb całkowitych w tablicy a.
Ale często widzę, że programiści używają memset, aby ustawić elementy tablicowe int na 0 lub -1.

int a[10]; 
int b[10]; 
memset(a, 0, sizeof(a)); 
memset(b, -1, sizeof(b)); 

Według mojego rozeznania, inicjowanie z całkowitą 0 jest OK bo 0 mogą być reprezentowane w 1 bajt (może się mylę w tym kontekście). Ale jak można zainicjować b z -1 (wartość 4 bajtów)?

+23

Dół, staraj się wyjaśnić? Czy to pytanie jest nieistotne dla tej witryny lub czegoś innego? – haccks

+0

Nieco mylisz się z powodu inicjalizacji z '0' jest OK. Jest OK, ponieważ '0' mieści się w' unsigned char' (więc nie jest obcięte gdy jest używany jako drugi argument 'memset') * i * ponieważ wzorzec bitowy w pamięci dla' sizeof (int) '-byte zero jest identyczne z wzorcem bitów w pamięci dla 'sizeof (int)' z kolei jedno bajtowe zera. Obie te rzeczy muszą być prawdziwe, aby to zadziałało. Rzeczywiście, te rzeczy są prawdziwe dla dokładnie dwóch liczb w arytmetyce dwójkowej-uzupełniającej: '0' i' -1'. – zwol

Odpowiedz

65

dziwne, powodem tego pracuje -1 jest dokładnie taki sam jak w przypadku, że współpracuje z zer W two's complement binary representation, -1 ma 1 S we wszystkich swoich bitów, bez względu na wielkość całkowitej, to wypełnienie regionu z bajtami wypełnionymi wszystkimi 1 s tworzy region -1 podpisanys, a s i short s na sprzęcie uzupełniającym dwóch.

Na sprzęcie, który różni się od uzupełnienia dwóch, wynik będzie inny. Stała całkowita liczbowa -1 zostanie przekonwertowana na unsigned char wszystkich, ponieważ standard określa, w jaki sposób należy przeprowadzić konwersję. Jednakże region bajtów ze wszystkimi bitami ustawionymi na 1 będzie interpretowany jako wartości integralne zgodnie z regułami platformy. Na przykład na sprzęcie o znaku i skali wszystkie elementy tablicy będą zawierały najmniejszą ujemną wartość odpowiedniego typu.

+15

Czy użycie '~ 0' nie byłoby faktycznie takie samo (i bardziej przejrzyste)? –

+2

@FiddlingBits Tak, używając '~ 0 'zdecydowanie uniknęłoby zamieszania. – dasblinkenlight

+0

Dostałem twoją odpowiedź, ale czy możesz wyjaśnić tę linijkę: * więc wypełnienie regionu -1 bajtami daje region -1 podpisanych int, longs i shortów. *? – haccks

Powiązane problemy