2016-08-26 2 views
0

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

Что означает это утверждение? Я знаю, что диапазон целых чисел намного больше, чем диапазон байтов. Может кто-нибудь объяснить? PS: Я начинаю программировать. Thanks

+0

Дублирование? http://stackoverflow.com/questions/31674821/conversion-of-integer-to-byte-in-java – muymoo

ответ

0

Modulo (%) означает остаток после чистого деления. Такие, как 5 % 2 == 1

Таким образом, если вы пытаетесь создать byte из-за int и это больше, чем максимальный диапазон byte, он будет делить на максимальном значении byte и дать вам остаток как byte значение.

Пример:

int a = 300 //The max value of a Byte is 256 

byte b = (byte)a; //cast it to a byte, so take the remainder of 300/256. 

//This produces 300 % 256, which is equal to 34. 
+0

Так эффективно 34 будет храниться в 'b' сейчас? –

+0

@AnkitSahay Это правильно! – Orin

+0

Но разве это явно неэффективно? Не только информация «а» теряется, но и наименее точна, учитывая, что по крайней мере 256 ближе к 300, поэтому сохранение 256, а не 34 имеет больше смысла? Я имею в виду, почему даже разрешить этот тип преобразования, не должен ли компилятор быть сконструирован таким образом, чтобы он сообщал об ошибке при превышении диапазона? –

0

Там нет по модулю на самом деле. Сужение преобразования в Java сокращает биты (байт имеет 8-битное значение, целое - 32 бит). Так что я сделал пример преобразования байт:

int[] values = new int[]{ 300, 128, -1, -129, -4097}; 

for(int i : values) { 
    String intValue = Integer.toString(i); 
    String intBinary = Integer.toBinaryString(i); 
    String byteValue = Byte.toString((byte) i); 
    String byteBinary = intBinary.substring(intBinary.length() - 8); 

    System.out.println("=============="); 
    System.out.println("Int val: " + intValue); 
    System.out.println("Int bin: " + intBinary); 
    System.out.println("Byte val: " + byteValue); 
    System.out.println("Byte bin: " + byteBinary); 
} 

Выход является довольно неожиданным, если вы думаете о по модулю (128 мой любимый). Помните, что первый бит определяет, является ли число положительным или отрицательным, но оно также является частью значения (поэтому диапазон байтов составляет от 127 до -128).

============== 
Int val: 300 
Int bin: 100101100 
Byte val: 44 
Byte bin: 00101100 
============== 
Int val: 128 
Int bin: 10000000 
Byte val: -128 
Byte bin: 10000000 
============== 
Int val: -1 
Int bin: 11111111111111111111111111111111 
Byte val: -1 
Byte bin: 11111111 
============== 
Int val: -129 
Int bin: 11111111111111111111111101111111 
Byte val: 127 
Byte bin: 01111111 
============== 
Int val: -4097 
Int bin: 11111111111111111110111111111111 
Byte val: -1 
Byte bin: 11111111 

Modulo вещь является точной, если мы работаем на значениях выше или равна 256.

Смежные вопросы