Samstag, 1. Oktober 2011

 

Überlauf mit C-Datentypen in Python

Wenn man z.B. ganze Zahlen mit nur einem Byte (8bit) darstellen will, so hat man den Bereich -128 (-28 - 1) bis +127 (28 - 1 - 1) zur Verfügung, weil üblicherweise die negativen Zahlen im Zweierkomplement dargestellt werden. Hat eine ein Byte große Variable var den Wert 127, so entspricht das binär 011111112. Zählt man 1 dazu, so erhält man binär 100000002. Dieser Wert entspricht aber der Zahl -12810.
-110 entspricht der binären Zahl 111111112 im Zweierkomplement (ansonsten wäre es 28 - 1 also 255). Zählt man zu 111111112 1 dazu, erhält man 1000000002. Da der Einser ganz vorne die 9. Stelle wäre, die in 8bit nicht mehr dargestellt werden kann, so fliegt sie raus und wir bekommen 000000002, also 0.
Das folgende Bespiel zeigt die Verwendung eines C-Datentypen für ein Byte, wo tatsächlich immer nur 8bit verwendet werden. Allerdings kann man nicht unmittelbar mit den Werten rechnen, da diese Werte sonst einfach in den entsprechenden Python-Typ int umgewandelt werden würde und es nicht zu einem Überlauf käme.
import ctypes # see help(ctypes)

def inc(var):
    """increment var by one"""
    return type(var)(var.value + 1)

def dec(var):
    """decrement var by one"""
    return type(var)(var.value - 1)

if __name__ == '__main__':
    var = ctypes.c_byte(126) # var = 126 - one byte
    var = inc(var)           # var = 127
    print(var.value)
    var = inc(var)           # var = -128 (10000000 binary)
    print(var.value)
    
    var = ctypes.c_byte(-1)  # var = -1 - one byte (11111111 binary)
    var = inc(var)           # var = 0
    print(var.value)


Im folgenden Video wird das auch ganz schön erklärt:

Labels: , , ,


Kommentare:

Kommentar veröffentlichen

Abonnieren Kommentare zum Post [Atom]





<< Startseite

This page is powered by Blogger. Isn't yours?

Abonnieren Posts [Atom]