Приведение типа данных байтов - PullRequest
0 голосов
/ 26 мая 2018

Пожалуйста, объясните, как работает код ниже, так как мы знаем, что тип данных байтов в java допускает диапазон от -128 до 127.

Мой фрагмент кода:

public class DataTypes {

public static void main(String args[]){
byte b = (byte)140;
System.out.println(b);
   }
}

Вывод:-116

Ответы [ 4 ]

0 голосов
/ 26 мая 2018

Я думаю, что когда вы приводите целое число (140) к байту, целочисленное значение преобразуется в беззнаковый байт, а затем значение переменной b преобразуется в байт со знаком.Число 140 считается значением без знака, так как число не имеет индикатора значения знака (+ или -)

Примечание о байте без знака (правильное значение - представление (в байтах файла) левого значения): 0-127 = 0-127 (-128) - (-1) = 128 - 255

0 голосов
/ 26 мая 2018

Может быть, это поможет объяснить.Самый верхний бит определяет «знак» (положительный или отрицательный) переменной.Поскольку в Java нет явной целочисленной формы «без знака», лучшее, что вы можете сделать, - это применить «побитовую» операцию к элементу до его отображения, чтобы его считали «без знака» ... или вы можете отобразить его, используя егошестнадцатеричный формат, который по своей природе без знака.

public class DataTypes {

   public static void main(String args[]){
      byte b = (byte)140;
      System.out.println("hex value = "+String.format("0x%02X",b)+"\n");
      System.out.println("dec value = "+String.format("%d",(b & 0xff))+"\n");
   }
}

и результат

hex value = 0x8C

dec value = 140
0 голосов
/ 26 мая 2018

140 - это int.Он преобразуется в byte в соответствии с Спецификацией языка Java, раздел 5.1.3 , следующим образом:

Сужающее преобразование целого числа со знаком в целочисленный типT просто отбрасывает все, кроме n младших битов

Самые младшие 8 битов int со значением 140 равны 10001100, что является правильным значением для байта, но отрицательно, так как его старшеебит, бит знака, равен 1.

0 голосов
/ 26 мая 2018

Байт будет иметь 8 бит в памяти.Используя это пространство, он может содержать 256 значений.Это будет варьироваться от -128 до 127, включая 0. Для поддержки этого охвата значение байта будет представлено в двоичном формате, используя метод комплимента для двух .MSB ( M ost S незначительное B it) будет определять знак (0 - положительный и 1 - отрицательный) значения.

Если мы рассмотрим случай 140, будет ясно, если мы представим 140 в двоичном формате, который равен 1000 1100.Помните, что MSB определит знак, а 1 означает, что число является отрицательным значением, а 0 означает, что это положительное значение.В этом случае у нас есть 1, что делает его отрицательным числом.

Если мы применим обратный процесс к комплименту этих двух, мы сначала получим 0111 0011, инвертировав все 1 s в 0с и от 0 с до 1 с.Затем, добавив 1, мы получим 0111 0100, что равно 116 в десятичном формате.Но MSB сказал, что это отрицательное значение, поэтому -116

...