Vediamo di fare un po' di chiarimenti rispolverando l'esame di info 1
dunque. Con long si intende un numero binario intero che occupa 4 byte (32 bit)
i long si possono suddividere in signed e unsigned
cioe' con segno e senza segno. Sono convenzioni e dipende da quale viene adottata da un particolare software/SO/interprete e chi piu' ne ha piu' ne metta.
Se decidi di voler trasformare un IP in un long unsigned allora la tua funzione "funziona".
Poiche con 4 Byte e' possibile codificare 2^32 numeri e' ovvio che i numeri che si possono ottenere con un signed non sono gli stessi che si ottengono con un unsigned.
Mi spiego meglio: 3232235777 non e' codificabile come unsigned. Cioe' non c'e' nessuna sequenza di 4 byte che se interpretata come unsigned dia 3232235777.
Mi spiego ancora meglio: 3232235777 in binario diventa:
11000000 10101000 00000001 00000001
ma questo numero ora puo' essere interpretato come unsigned (3232235777) oppure come signed.
Se lo si interpreta come signed il 32esimo bit partendo da dx e' il segno (cioe' e' negativo perche' il bit vale 1)
Per trasformare un unsigned in signed basta togliergli 2^32
3232235777 - 2^32 = -1062731519
Javascript non ha una forte tipizzazione per cui non hai modo di sapere come un numero venga salvato in memoria. Cioe' tu vedi il numero ma non sai se e' memorizzato come long o come byte etc...
probabilmente l'utilizzo di operatori booleani forza javascript a trattare il numero come signed long ma non ci farei troppo affidamento.
Sono stato poco chiaro? Di sicuro si'
Ma sono qua' se hai altri dubbi sui quali io possa aumentare la tua confusione

Rispondi quotando