JavaRush /Java блог /Random UA /Наведення примітивних типів. Приведення типу int до типу ...
Георгий
22 рівень
Санкт-Петербург

Наведення примітивних типів. Приведення типу int до типу short та byte

Стаття з групи Random UA
Наведення примітивних типів.  Приведення типу int до типу short та byte - 1Чому, якщо привести якісь значення типу 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. Віднімаємо одиницю та отримуємо зворотний код. Зручно робити так, записати додатковий код у відповідь і дивитися, до чого потрібно додати одиницю, щоб отримати додатковий код. Починаємо з крайнього правого розряду і дивимося: до чого потрібно додати 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
  2. Найскладніше за! Ми отримали інверсний код і нам залишилося отримати прямий. Інвертуємо всі 0 на 1 і навпаки:

    1100 0001- інверсний код;

    0011 1110 - Прямий код нашого числа, точніше його позитивного уявлення;

  3. Перекладаємо в десяткову систему числення ( Онлайн калькулятор з поясненням обчислень ):

    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
  1. 10.000.000 у 10-й системі числення = 0000 0000 1001 1000 1001 0110 1000 0000у 2-й.

    У Java число типу intзаймає 4 байти, а short- 2 байти, або 16 біт, тому відсікаємо зліва до 16 цифр:

  2. 1001 0110 1000 0000. Крайній лівий біт (старший біт, він знаковий біт) вийшов дорівнює 1. Значить маємо додатковий код негативного числа, тому переходимо до наступного пункту.
  3. Перекладаємо у зворотний код:

    
    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;

  4. Інвертуємо та отримуємо прямий код: 0110 1001 1000 0000.

  5. Перекладаємо в двійкову систему числення та отримуємо позитивне уявлення нашого числа:

    1∙2^14+1∙2^13+1∙2^11+1∙2^8+1∙2^7 = 16384+8192+2048+256+128 = 27008.
  6. Додаємо мінус і отримуємо відповідь:-27008

Наведення примітивних типів.  Приведення типу int до типу short та byte - 2Посилання на онлайн-калькулятор прямого, зворотного та додаткового коду. Також на цьому сайті під калькулятором є трохи теорії про зворотний та додатковий код.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ