2010-11-18 6 views
1

definiere ich eine ganze Zahl wie folgt aus:prüfen integer Basis Darstellung

x = 0xFF 

Aber wenn ich für den Wert auf den Dolmetscher fragen i erhalten:

255 

Gibt es eine Möglichkeit, den Interpreter zu zwingen, gib mir den Wert auf die gleiche Weise zurück, wie ich es definiert habe? Gibt es eine Möglichkeit, die Basisrepräsentation für eine ganze Zahl zu überprüfen?

+1

"den Interpreter zwingen, mir den Wert auf die gleiche Weise zurückzugeben, wie ich ihn definiert habe"? Was bedeutet das? Bedeutet dies, dass "x = 2 + 2" "2 + 2" anstelle von "4" melden sollte? –

+0

Das bedeutet, dass wenn Sie 0xFF eingeben, sollte 0xFF zurückgegeben werden, wenn Sie nach seinem Wert fragen. Ich meine, wenn Sie eine Variable definieren, deren Wert in base-16 (hexadezimal) dargestellt wird, sollte der Interpreter zeigen, dass sie in derselben Base und nicht in base-10 dargestellt ist. –

+0

Was ist der Unterschied zwischen '0xff',' 255' und '128 + 127'? Ich sehe nicht, wie du diese auseinanderhalten kannst? Was ist die Regel? –

Antwort

0

Auf jeden Fall wird der Wert binär dargestellt werden. Python erinnert sich nicht an die Art und Weise, wie Sie den Wert geschrieben haben, als Sie entschieden haben, ihn einer Variablen zuzuweisen.
Wenn Sie diese Informationen speichern möchten, erstellen Sie eine bestimmte Klasse, die diese Informationen für Sie speichert und den Wert korrekt anzeigt. Beachten Sie, dass Sie die Basis explizit angeben müssen, wenn Sie den Wert zuweisen.

2

0x ist hex.

Um den Interpreter zu zwingen, den ursprünglichen Wert anzuzeigen:

hex(x) 

>>> x = 0xFFF 
>>> x 
4095 
>>> hex(x) 
'0xfff' 
>>> 
+0

Aber ich kann nicht wissen, die Basis die Nummer im Voraus dargestellt wird. –

+0

Ich könnte Binärdateien haben, dezimal, oktal oder hexadezimal. –

+0

Es gibt keinen Unterschied zwischen diesen. Dies ist die gleiche Nummer. Wenn Sie oben einen 'type (x)' eingeben, wird immer noch ein int zurückgegeben. Warum willst du wissen ob das hex oder oktal ist? Die Nummer ist dieselbe. – user225312

1

0xFF (hex) und 255 (dezimal) die gleiche Anzahl. So sind 0377 (oktal) und 11111111 (binär). Egal, auf welcher Basis Sie sie definieren, es ist derselbe zugrunde liegende Wert, und es spielt keine Rolle mehr, wie Sie es deklariert haben.

+0

Natürlich sind sie die gleiche Nummer. Was ich frage ist, ob es eine Möglichkeit gibt, die Basis zu erhalten, wird eine Zahl dargestellt. –

+0

Zum Beispiel so etwas wie: Basis (0xFF) ---> Rückkehr 16 –

+0

Nr. Python ist es egal, wie Sie es definiert haben. 0xFF ist nur Binär 11111111 und Python wird es als '255' drucken, wenn Sie nicht anders sagen. – Spacedman

0

Die Ganzzahl wird unter Verwendung der Standard-Ganzzahldarstellung (Basis 2) dargestellt. Wenn Sie die Ganzzahl definieren, ordnen Sie ihr einen Wert zu, der implizit von Ihrer Repräsentation konvertiert wird, so dass die ursprüngliche Basis verloren geht. Wenn Sie wollten könnten Sie Ihre eigene Klasse definieren, die diese Informationen speichert zusammen mit dem zugrunde liegenden ganzzahligen Wert

3

Nr Weder Python noch eine andere Sprache weiß ich speichert die Basis Sie eine Ganzzahlliteral in schreiben. 0xFF ist zu unterscheiden von 255 . Diese werden beide in dieselbe zugrunde liegende Repräsentation konvertiert: binär.

  • Wenn Sie eine Basis erinnern wollen, dann müssen Sie eine andere Art als int. Vielleicht speichern Sie die Ganzzahlen in Zeichenkettenform "0xFF", oder als Tupel (0xFF, 16). int hat einfach nicht die gewünschten Informationen.

  • Realistischer ist es Ihre Verantwortung, die Ausgabe wie gewünscht zu formatieren. Wenn Sie einer Funktion eine hexadezimale Zahl zuführen und ein Ergebnis zurückerhalten, ist es Ihre Aufgabe, das Ergebnis auch als hexadezimal zu formatieren. Ich würde dieser Code nicht erwarten, „zu tun, was Sie wollen“:

    print foobar(10) 
    print foobar(0xFF) 
    

    Machen Sie Ihre Absichten explizit. Wenn die Standardformatierung (dezimal) nicht nach Ihrem Geschmack ist dann außer Kraft setzen:

    print '%04d' % (foobar(10))) 
    print '%04x' % (foobar(0xff))) 
    
+0

+1 für Zeichenfolge und Tupel – log0

0

Was alle anderen oben sagen, ist wahr - 0xff ist das gleiche wie 255 dezimal.Wenn Sie in der Lage sein müssen, die String-Darstellung für einen anderen Zweck zu halten, können Sie etwas tun:

class VerboseInt(object): 
    def __init__(self, val): 
     ''' 
     pass in a string containing an integer value -- we'll detect whether 
     it's hex (0x), binary (0x), octal (0), or decimal and be able to 
     display it that way later... 
     ''' 
     self.base = 10 
     if val.startswith('0x'): 
     self.base = 16 
     elif val.startswith('0b'): 
     self.base = 2 
     elif val.startswith('0'): 
     self.base = 8 
     self.value = int(val, self.base)   

    def __str__(self): 
     ''' convert our value into a string that's in the same base 
     representation that we were initialized with. 
     ''' 
     formats = { 10 : ("", "{0}"), 
      2: ("0b", "{0:b}"), 
      8: ("0", "{0:o}"), 
      16: ("0x", "{0:x}") 
      } 

     fmt = formats[self.base] 
     return fmt[0] + fmt[1].format(self.value) 

    def __repr__(self): 
     return str(self) 

    def __int__(self): 
     ''' get our value as an integer''' 
     return self.value 
0

Was würden Sie erwarten von:

x = 0x7F + 128 
print x 

Die numerische Basis ist nicht Teil Pythons interne Darstellung einer Ganzzahl. Sie könnten, wenn Sie möchten, eine Zeichenfolge anstelle eines int beibehalten und explizit in int konvertieren, wenn Sie dies benötigen.