Çok geç de olsa JB Nizet'in verdiği çözümün neden işe yaradığını açıklığa kavuşturmak için bu konudaki girdimi vermek istiyorum. Bir bayt ayrıştırıcı üzerinde çalışırken ve dize dönüşümünü kendim yaparken bu küçük soruna rastladım. Bu java belgesinin söylediği gibi, daha büyük boyutlu bir integral türünden daha küçük boyutlu bir integral türüne kopyaladığınızda:
https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.3
İşaretli bir tamsayının bir integral T türüne daraltılmış bir dönüşümü, n en düşük hariç hepsini atar sıra bitleri, burada n, tip T'yi temsil etmek için kullanılan bit sayısıdır.Numerik değerin büyüklüğü hakkındaki olası bilgi kaybına ek olarak, bu, sonuçtaki değerin işaretinin giriş değerinin işaretinden farklı olmasına neden olabilir. .
Bu java dokümanı https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
baytının dediği gibi bir baytın integral bir tür olduğundan emin olabilirsiniz
: Bayt veri türü 8 bitlik imzalı bir ikidir tamamlayıcı tamsayı.
Yani bir tamsayıyı (32 bit) bir bayta (8 bit) çevirme durumunda, bu tamsayının sonuncusunu (en az önemli 8 biti) verilen bayt değişkenine kopyalarsınız.
int a = 128;
byte b = (byte)a;
System.out.println(b);
Hikayenin ikinci kısmı, Java tekli ve ikili operatörlerinin işlenenleri nasıl teşvik ettiğini içerir.
https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.6.2
Genişletme ilkel dönüştürme (§5.1.2), işlenenlerden birini veya her ikisini de belirtildiği gibi dönüştürmek için uygulanır aşağıdaki kurallara göre:
İşlenenlerden biri double türündeyse, diğeri double türüne dönüştürülür.
Aksi takdirde, işlenenlerden biri float tipindeyse, diğeri float'a dönüştürülür.
Aksi takdirde, işlenenlerden biri long türündeyse, diğeri long'a dönüştürülür.
Aksi takdirde, her iki işlenen de int türüne dönüştürülür.
İntegral türü int ve / veya daha düşük ile çalışıyorsanız, int türüne yükseltileceğinden emin olabilirsiniz.
a = b & 0xFF;
System.out.println(a);
Ben de bunun etrafında kafamı kaşıdım :). Bunun için burada rgettman tarafından iyi bir cevap var.
Java'daki bitsel operatörler yalnızca tamsayı ve uzun için mi?