Внутри write(int)
просто приведёт свой параметр к char
, поэтому write(i)
эквивалентно write((char)i)
.
Теперь в Java внутренне char
- это просто целочисленный тип с диапазоном 0-65535 (т.е. 16 бит).Преобразование int -> char является «сужающимся примитивным преобразованием» ( спецификация языка Java, 5.1.3 ), а int
является целым числом со знаком, следовательно:
Aсужающее преобразование целого числа со знаком в целочисленный тип T просто отбрасывает все биты, кроме n младших разрядов, где n - количество битов, используемых для представления типа T. В дополнение к возможной потере информации о величине числового значения,это может привести к тому, что знак полученного значения будет отличаться от знака входного значения.
Именно поэтому Javadoc говорит, что записаны только два младших байта.
Теперь,что это означает с точки зрения символов, зависит от того, как вы хотите интерпретировать значения int.char
в Java представляет кодовую точку Unicode в UTF-16, то есть 16-битное число, представленное символом, интерпретируется как номер кодовой точки Unicode.Поэтому, если каждое из ваших значений int является номером 16-битной кодовой точки, у вас все в порядке (на самом деле, это верно только для символов в BMP; если вы используете символы в дополнительных плоскостях, каждая кодовая точка Unicode будет закодированана две char
с).Если это что-то еще (включая кодовую точку с более чем 16-разрядным или отрицательным числом или что-то еще целиком), вы получите мусор.
Как это влияет, если таковые имеются, на написание не-utf8 символов, которые были преобразованы в int?
Не существует такого понятия, как "non"-utf8 char ".UTF-8 - это кодировка , которая представляет собой способ представления кодовой точки Unicode, поэтому поставленный вопрос не имеет смысла.Может быть, вы могли бы объяснить, что делает ваш код?