int
до типу short
або byte
результати бувають несподіваними? Давайте розумітися!
int i = 450;
byte b = (byte)i;
System.out.println(b);
Результат на екрані:
-62
Несподівано, але цьому є логічне пояснення, більше, цю дію можна зробити власноруч. Для цього нам потрібно перевести 450 з десяткової системи в двійкову:
450/2. 0
225/2. 1
112/2. 0
56/2. 0
28/2. 0
14/2. 0
7/2. 1
3/2. 1
1/2. 1
У правий стовпчик від числа записуємо його залишок від поділу на 2, а під самим числом пишемо результат поділу нашого числа на два, якщо залишок 0. Якщо залишок 1, то нижче записуємо цілу частину від поділу на два. ( Онлайн калькулятор з поясненням обчислень ). У результаті ми отримуємо, що в двійковій системі числення 450 = 11100 0010
. Будь-яке число типу int
займає 4 байти або 32 біти, де кожен біт - це 0 або 1. У нашому випадку зайняті лише 9 бітів, і в принципі наш у int i = 450
двійковій системі виглядає так:
0000_0000_0000_0000_0000_0001_1100_0010
Ми хочемо записати нашу змінну в змінну типу byte
, але число типу byte
займає 1 байт (випливає з назви цього типу) або 8 біт. Тому зайві біти зліва просто відкидаються, і в результаті ми отримуємо:
1100 0010
Діапазон значень типу byte
: -128 до 127. Кожне число займає 8 біт і кожного числа крайній лівий біт - знаковий біт (sign bit). У всіх позитивних чисел він дорівнює 0, у всіх негативних він дорівнює 1. Поспішати перекладати результат, отриманий вище, в 10-ную систему не потрібно, т.к. ми отримали додатковий код шуканого числа, а чи не прямий. Крайній біт зліва вийшов дорівнює 1, отже число у нас негативне, а у негативних чисел прямий і зворотний код не збігається, на відміну від позитивних. Якби знаковий біт дорівнював 0, то ми могли б відразу перевести число в десяткову систему числення і отримати: 66. Але знаковий біт негативний, тому спочатку додатковий код потрібно перевести в прямий і додати знак мінус. Для наочності та тренування, спочатку спробуємо отримати додатковий код якогось числа, наприклад -15. Для цього в прямому коді його позитивного уявлення (числа 15) потрібно змінити всі 0 на 1 і навпаки (отримати зворотний код, також називають інверсний), а потім додати до результату одиницю. У десятковій системі 15 = 0000 1111
; Зворотний код (змінюємо всі 0 на 1 і навпаки) = 1111 0000
; Додатковий код (додаємо одиницю):
1 1 1 1 0 0 0 0
0 0 0 0 0 0 0 1
1 1 1 1 0 0 0 1
Додатковий код числа -15 1111 0001
:; Тепер, за аналогією з прикладом вище, нам потрібно перевести вже наш додатковий код у прямий, нагадаю, він дорівнює 1100 0010
.
-
Віднімаємо одиницю та отримуємо зворотний код. Зручно робити так, записати додатковий код у відповідь і дивитися, до чого потрібно додати одиницю, щоб отримати додатковий код. Починаємо з крайнього правого розряду і дивимося: до чого потрібно додати 1, щоб отримати 0? До 1, отримаємо 10, 0 йде у відповідь, а одиниця на наступний розряд. Далі потрібно додати до 0, щоб отримати один. Одиницю, але оскільки ми з попереднього розряду маємо одиничку, то у відповідь пишемо 0. Далі, щоб отримати 0, що потрібно додати до 0? Звісно, 0. Так ще 4 рази. І залишабося останні 2 розряди, де до 0 треба щось додати, щоб отримати 1. Звичайно, в обох випадках потрібно додати 1. Разом:
1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0
-
Найскладніше за! Ми отримали інверсний код і нам залишилося отримати прямий. Інвертуємо всі 0 на 1 і навпаки:
1100 0001
- інверсний код;0011 1110
- Прямий код нашого числа, точніше його позитивного уявлення; -
Перекладаємо в десяткову систему числення ( Онлайн калькулятор з поясненням обчислень ):
0011 1110 = 0∙2^7+0∙2^6+1∙2^5+1∙2^4+1∙2^3+1∙2^2+1∙2^1+0∙2^0 = 0+0+32+16+8+4+2+0 = 62;
Залишилося тільки додати до мінус і наша відповідь:
-62.
short
до типу int
:
int i = 10_000_000;
short s = (short)i;
System.out.println(s); // -27008
-
10.000.000 у 10-й системі числення =
0000 0000 1001 1000 1001 0110 1000 0000
у 2-й.У Java число типу
int
займає 4 байти, аshort
- 2 байти, або 16 біт, тому відсікаємо зліва до 16 цифр: -
Перекладаємо у зворотний код:
1 0 0 1 0 1 1 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0
Зворотній код:
1001 0110 0111 1111
; -
Інвертуємо та отримуємо прямий код:
0110 1001 1000 0000
. -
Перекладаємо в двійкову систему числення та отримуємо позитивне уявлення нашого числа:
1∙2^14+1∙2^13+1∙2^11+1∙2^8+1∙2^7 = 16384+8192+2048+256+128 = 27008.
-
Додаємо мінус і отримуємо відповідь:
-27008
1001 0110 1000 0000
. Крайній лівий біт (старший біт, він знаковий біт) вийшов дорівнює 1. Значить маємо додатковий код негативного числа, тому переходимо до наступного пункту.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ