Hi,
ich hab gerade gelesen, dass man mit dieser Methode hier einen schon belegten Byte in einen Integer umwandeln kann:
Java:
staticintbyteToInt(byte b){return b &0xff;}
Doch ich kapiere den Code nicht, weil wenn ich jetzt z.B. schreibe
Java:
byte b =200
Dann fängt das byte doch wieder von seiner niedrigsten Zahl (-128) an zu zählen, also kommt dabei herraus -56. Nur wenn ich jetzt meine Methode aufrufe:
Java:
byteToInt((byte)-56)
bzw.
Java:
byteToInt(b)
Wie zum Teufel kann da dann wieder 200 raus kommen? Ich meine die Zahl 200 hat ja 0 mit -56 zu tun...
EDIT:
Hab gerade gemerkt wenn man es mit einer größeren Zahl macht, kommt beim Konventieren ne falsche Zahl herraus. Nimmt diese Methode also auf gut deutsch nur das Vorzeichen weg?
s in Java sind vorzeichenbehafte Ganzzahlen und haben den WerteBereich -128 bis 127. Die Darstellung erfolgt im Zweierkomplement, was u. a. bedeutet, dass für negative Werte alle höherwertigen Bits gesetzt sind.
Wenn Java ein negatives
Code:
byte
in ein
Code:
int
erweitert, wird der gleiche negative Wert als Integer natürlich ebenfalls im Zweierkomplement dargestellt, was bei Javas 32-bit Integern bedeutet, dass alle 24 höherwertigen Bits im
Code:
int
gesetzt sind. Die Zahl
Code:
0xff
ist der Integer, in dem nur die 8 niederwertigesten Bit gesetzt sind. Ver-AND-et man einen Integer mit
Code:
0xff
löscht das die obersten 24 bit und der Integer nimmt hier einen positiven Wert an, nämlich den Wert des bytes, aus dem gecastet wurde, wenn es vorzeichenlos gewesen wäre.
Wenn man von Bytes und Zweierkomplement spricht, haben die Werte 200 und -56 durchaus einen Zusammenhang: Im Zweierkomplement gilt -x= n-x , wobei für ein Byte n=2^8=256 ist.
Aber 0xff hat doch 8Bits oder? Also währe es 11111111, wenn man da jetzt noch Vorzeichen hat währen es doch 9bits...? Und außerdem, währe es nicht logischer wenn man ein XOR hernimmt wobei wenn z.B. das Minus die Ziffer 0 währe das es dann in eine 1 umgewandelt wird?
EDIT:
Oder existiert in Wirklichkeit gar kein Vorzeichen, also nich in dem Sinne das für + eine 1 dran steht und für - eine 0, sondern so bald die 127 überstiegen wurde fängts bvei -128 wieder an?
Ein byte hat immer 8 Bit - egal ob signed oder unsigned. In Java gibt es nur signed Variablen - das 8. Bit wird dabei zur Darstellung des Vorzeichens verwendet. Ein zusätzliches Bit für diese Aufgabe existiert nicht.
Und auch das binäre UND stimmt so schon. Am besten begreift man dies wohl, wenn man sich die Bitfolgen einfach mal aufschreibt:
So stimmt das nicht: Wenn das höchstwertigste Bit gesetzt ist, ist der Wert negativ, wenn die Zahl im Zweierkomplement dargestellt wird. Die restlichen 7 bit ergeben aber nicht etwa einen "Absolutwert".
Oder existiert in Wirklichkeit gar kein Vorzeichen, also nich in dem Sinne das für + eine 1 dran steht und für - eine 0, sondern so bald die 127 überstiegen wurde fängts bvei -128 wieder an?
So in etwa. Der Zweck des Zweierkomplementes ist es eine Dualzahl so darzustellen, dass mit ein und derselben Schaltung vorzeichenbehaftete Strichrechnung möglich ist. Bei einer solchen Schaltung nutzt man meines Wissens gezielt Integerüberläufe im Register aus.