BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
String fileName = r.readLine();
r.close();
FileInputStream fis = new FileInputStream(fileName);
byte b, c = 127;
while (fis.available()>0){
b = (byte) fis.read();
c = (b < c) ? b : c;
}
/*почему валидатор выдавал таймаут с таким решением?
while ((b = (byte) fis.read()) != -1){
c = (b < c) ? b : c;
}*/
fis.close();
System.out.println(c);
и почему минимальный байт равен 10 при таком наборе в файле:
-127
-9
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18?
Андрей
22 уровень
почему не принимал валидатор и почему такой вывод?
Решен
Комментарии (12)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
--------Master
22 августа 2018, 10:49решение
Потому, что приведенное содержимое файла состоит из символов (-127 - 4 символа '-', '1', '2', '7' и т.д.), а считываемый байт - это код каждого из символов. 10 - код символа переноса строки
+2
Андрей
22 августа 2018, 11:04
для каких символов значение байта может принимать отрицательное значение?
или это как-то связано с диапазонами от 0 до 255 и от -128 и до 127 касательно байтов?
пытался понять, но так и не смог с этими байтами до конца разобраться...
0
--------Master
22 августа 2018, 11:19
Байт в памяти компьютера представлен 8 битами - от 0000 0000 (0) до 1111 1111 (255). В случае типа byte в Яве получается, что первый бит (самый левый) определяет знак числа, т.е. само число состоит из 7 битов - от 000 0000 до 111 1111 (127). Если первый бит равен 0, то в обычной десятеричной системе берутся эти 7 бит в исходном виде, если 1 - вычитается 128, т.е. 1000 0001 (129) соответствует (000 0001 - 128) = -127 и т.д.
+3
Андрей
22 августа 2018, 12:57
ЭТО КАК ОЗАРЕНИЕ... спасибо большое!!! я наконец-то допер. это жесть!!! 256 значений всего, но с учетом знака диапазон такой!
получается, что read() возвращает всегда только положительные значения от 0 до 127?
а что по поводу закомментированного кода? почему таймаут у валидатора? такое решение правильное или нет?
p.s. уже прочитал, что read() возвращает от 0 до 255. вот тут пока не могу соотнести -127 и 255... или просто прописали, что read() возвращает без учета знака?
0
--------Master
22 августа 2018, 13:25
По сути, read считывает от 0 до 255 - от 0000 0000 до 1111 1111, но с учетом особенности Явы первый бит считается битом знака, поэтому минимальное и максимальное значения на 128 меньше обычного. Даже можно рассматривать так: b = b7 - b1 * 128, где b7 - 7 битов числового значения, b1 - первый бит знака (0 или 1)
0
Андрей
23 августа 2018, 12:22
так а возвращает read() почему значения от 0 до 255 (т.е. без учета первого бита, как знака + или -)? вот этого понять не могу
0
--------Master
23 августа 2018, 14:13
Потому что из всех знакомых мне языков только в Яве байт имеет свой собственный диапазон значений, от -128 до 127, а в остальных, включая низкоуровневые - стандартный, от 0 до 255. И коды символов нумеруются именно с нуля.
А метод read возвращает не byte, а int - помимо стандартных значений от 0000 0000 до 1111 1111 (0...255) есть еще и -1 при ошибке чтения
0
Андрей
25 августа 2018, 09:25
что read возвращает я знаю, меня интересовало в разрезе именно значений байта.
получается, что во всех остальных языках знак минус передается по-другому?
и в методе read значения байта воспринимается/выводится не как во всей джаве? т.е. первый бит он воспринимается не как знак?
0
--------Master
25 августа 2018, 09:48
В других языках (в тех, с которыми я когда-то сталкивался) байт не имеет знака, а вспоминается, например тип shortint из Паскаля - он как раз принимает значения от -128 до +127, в отличие от byte - 0...255. Есть типы из двух байт со знаком и без - в том же паскале integer (-32768...32767) и word (0...65535), в одном все биты используются для записи числового значения, в другом один трактуется как знак числа
0
Андрей
25 августа 2018, 20:55
ясно. что-то понял, что-то дойдет со временем... надеюсь)) спасибо!
+1
Ola Backend Developer
21 августа 2018, 11:26
Предполагаю, что явно преобразование типов работает не так, как ты хочешь:
наверное, не дает -1 => цикл не заканчивается.
Ну и также
не дает -127.
0
Андрей
22 августа 2018, 10:37
вывод: -1 -128.
другие значения будут, если значение, которое приводишь к типу "byte" выйдет за пределы диапазона от -128 до 127.
ну и поток, как я уже понял, читает не целиком "-127", а один байт - это "-", второй байт - "1", третий - "2", пятый и шестой - "/n" - конец строки, седьмой - "-".
0