Это мой код:
public class test {
public static void main(String[] args) {
byte a=(byte)127, b=2;
byte c=(byte)(a*b);
System.out.println(c);
}
}
Почему результат -2
?
Это мой код:
public class test {
public static void main(String[] args) {
byte a=(byte)127, b=2;
byte c=(byte)(a*b);
System.out.println(c);
}
}
Почему результат -2
?
Потому что a*b
приведет к временной переменной int, а именно 254, которая равна 1111 1110. При передаче в байты это будет обрабатываться как знаковое значение. MSB равен 1, поэтому его значение будет отрицательным, а значение будет - (((inv) 111 1110) + 1) = - ((000 0001) + 1) = -2.
a * b
- 254, поэтому ваш код:
byte c=(byte)254;
Десятичное число 254 является двоичным 11111110, которое равно: -2. Почему?
Прежде всего, число отрицательно, так как оно начинается с 1 (два дополнения), а затем:
¬ 1 1 1 1 1 1 1 0
- 0 0 0 0 0 0 0 1
.
0 0 0 0 0 0 0 1
1 +
---------------
0 0 0 0 0 0 1 0
Это представляет 2 в десятичной системе, но помните, что MSB равен 1? Таким образом, конечный результат -2.
Поскольку байт является подписанным типом 2 * 127, это двоичный код "11111110", который два дополнения для -2.
потому что байт подписан, а не без знака.
254 = FE = 1111 1110
первый '1'
представляет число как отрицательное число.
127 в 8 бит представляется в двоичном виде следующим образом:
01111111
Умножьте на 2, и вы получите следующее:
11111110
(Когда вы умножаете на 10 в базе 10, все цифры могут быть сдвинуты влево, в следующую позицию. То же самое естественно, когда вы умножаете на 2 в двоичном формате)
Java использует 2 дополнения для представления отрицательных чисел. В основном, самый левый бит - бит знака (0 для +, 1 для -). Чтобы преобразовать положительное число в отрицательное число, переверните все биты и добавьте один.
Пример: 00000010
= 2, переверните биты: 11111101
, затем добавьте один: 11111110
= -2. Это то же самое, что и 127 * 2 выше.
Я думаю, что вы пытались спросить, почему переполнение целого числа со знаком 8 бит будет обращено к отрицательному числу для вашего случая.
Как и в CPU, нет АБВ с 8 бит, поэтому 8 бит будет расширяться до 32 бит, после операции вернет нижние 8 бит для пользователя.
В CPU: 0000_007F * 0000_0002 = 0000_00FE
Это переполнение для подписанных 8 бит, но значение уже рассчитано.
Таким образом, возвращаемое значение равно FE
.
Для подписанных 8 бит, FE
- -2
.