dechex (4000) - Perché non è firmato?

-1

Perché il dechex(4000) di PHP non restituisce un valore esadecimale con segno?

Restituisce:

fa0

Al contrario di:

0xfa0

E signed è il termine corretto da usare per descrivere questo problema? O c'è un termine migliore per descrivere la porzione 0x ? Si chiama prefisso?

    
posta Chud37 30.01.2013 - 12:59
fonte

2 risposte

4

Questo non riguarda la firma.

fa0 e 0xfa0 rappresentano lo stesso numero esatto. Tuttavia, senza contesto, probabilmente non ti rendi conto che il primo rappresenta un numero in formato esadecimale. Il prefisso 0x è solo un suggerimento per te (o il computer) che rappresenta un numero esadecimale.

Perchè non lo fa: perché dovrebbe? Non è necessario. Se dovessi processarlo e sai già che rappresenta un numero esadecimale, devi semplicemente ignorare il prefisso 0x . Pertanto, potrebbe rendere l'elaborazione leggermente meno ingombrante in alcune circostanze.

Signedness significa essere in grado di rappresentare sia valori positivi che negativi.

    
risposta data 30.01.2013 - 13:06
fonte
1

Riesco a vedere come potresti fare riferimento al prefisso 0x come a "segno". significa che le seguenti cifre sono esadecimali. Ma nella programmazione, usiamo quasi universalmente la parola "segno" per riferirsi a qualcosa che indica se un numero è positivo o negativo. In un valore numerico memorizzato, di solito c'è un bit che indica se un numero è negativo. Nel testo del programma, possiamo scrivere +42 per indicare un numero intero positivo e -42 per indicare un numero intero negativo; il carattere + o - è il segno . (Sto soffermando su alcuni dettagli riguardanti il complemento a 2 e altre rappresentazioni, e problemi riguardanti 0 , anche + e - sono in realtà operatori, non parte delle costanti intere. .)

Quindi riferirsi a qualcosa di diverso da un indicatore positivo o negativo come un "segno" è destinato a causare confusione. Il 0x in un valore letterale esadecimale come 0xfa0 può essere definito come prefisso , non come "segno".

Il nome della funzione dechex di PHP, documentato qui , è in realtà un po 'fuorviante. Prende un argomento intero senza segno e restituisce una stringa contenente la rappresentazione esadecimale leggibile dall'uomo di quell'argomento. L'argomento non è decimale ; è quasi certamente memorizzato in binario. Pensiamo agli interi come decimali perché di solito li scriviamo in questo modo, ma in realtà i valori interi possono essere scritti in decimali, ottali, esadecimali o come espressioni complicate, il che si traduce in un valore binario memorizzato. Non converte decimale in esadecimale; converte un numero in esadecimale - un numero che può essere risultato dalla conversione di un valore letterale decimale nel codice sorgente PHP in un numero intero binario memorizzato.

Per quanto riguarda il motivo per cui il risultato di dechex() non include il prefisso 0x , la documentazione non dice, ma probabilmente è solo perché è più conveniente in questo modo. Se desideri una stringa con un prefisso 0x , è banalmente facile aggiungerla tu stesso (e decidere se vuoi 0x o 0X ). Se dechex() ha restituito una stringa con il prefisso e tu non l'hai voluta, dovresti rimuoverla.

Questo piccolo programma dimostra questi punti:

#!/usr/bin/php
<?php
    // Various arguments to dechex (decimal, octal, hexadecimal):
    echo "dechex(12345678)   = \"", dechex(12345678),   "\"\n";
    echo "dechex(012345678)  = \"", dechex(012345678),  "\"\n";
    echo "dechex(0xDEADBEEF) = \"", dechex(0xdeadbeef), "\"\n";
    echo "dechex(4*5)        = \"", dechex(4*5),        "\"\n";
    echo "With a prefix:       \"0x", dechex(4*5), "\"\n";
    // Another approach using sprintf():
    echo sprintf("0x%x", 1234), "\n";
    // ... or printf:
    printf("0X%X\n", 1234);
?>

Ecco l'output:

dechex(12345678)   = "bc614e"
dechex(012345678)  = "53977"
dechex(0xDEADBEEF) = "deadbeef"
dechex(4*5)        = "14"
With a prefix:       "0x14"
0x4d2
0X4D2
    
risposta data 30.01.2013 - 17:12
fonte

Leggi altre domande sui tag