[Java] Rzutowanie-dziwny wynik

Awatar użytkownika
lightinside
Użytkownik
Użytkownik
Posty: 796
Rejestracja: 25 lis 2011, o 22:25
Płeć: Kobieta
Lokalizacja: Poznań/Łódź
Podziękował: 111 razy
Pomógł: 29 razy

[Java] Rzutowanie-dziwny wynik

Post autor: lightinside »

Dlaczego z tego kodu:

Kod: Zaznacz cały


//: c03:CastingNumbers.java
// From 'Thinking in Java, 2nd ed.' by Bruce Eckel
// www.BruceEckel.com. See copyright notice in CopyRight.txt.
// What happens when you cast a float 
// or double to an integral value?

public class CastingNumbers {
	public static void main(String[] args) {
		double above = 0.7, below = 1.4;
		System.out.println("above: " + above);
		System.out.println("below: " + below);
		System.out.println("(int)above: " + (int) above);
		System.out.println("(int)below: " + (int) below);
		System.out.println("(char)('a' + above): " + (char) ('a' + above));
		System.out.println("(char)('a' + below): " + (char) ('a' + below));
	}
} // /:~


Wychodzi:

Kod: Zaznacz cały


above: 0.7
below: 1.4
(int)above: 0
(int)below: 1
(char)('a' + above): a
(char)('a' + below): b

Czemu w ostatniej linijce jest b zamiast a?
Ostatnio zmieniony 21 maja 2014, o 20:08 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[Java] Rzutowanie-dziwny wynik

Post autor: Afish »

Znak jest traktowany jako kod ASCII, następnie jest zwiększany i traktowany ponownie jako znak.
Awatar użytkownika
Althorion
Użytkownik
Użytkownik
Posty: 4541
Rejestracja: 5 kwie 2009, o 18:54
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 9 razy
Pomógł: 662 razy

[Java] Rzutowanie-dziwny wynik

Post autor: Althorion »

Dokładniej: znak jest kodowany w UTF-16, nie w ASCII — więc zajmuje szesnaście, nie siedem bitów. Znak „a” jest więc kodowany do „0x0061”, zwiększany o 1,4 i następnie rzutowany znowu do Unikodu, stając się „0x0062”, któremu odpowiada „b”.
ODPOWIEDZ