Что напечатает следующий оператор:
System.out.println((int) (char) (byte) -1)?
Ответ 65535 (для наглядности 0x0000FFFF)
Знаковое расширение происходит только тогда, когда тип значения был знаковый. В данном случае расширения знакового разряда не выполняется.
Умный совет дают авторы: если вы не можете с первого взгляда сказать, что делает некая программа, то возможно она делает совсем не то, что вы от нее хотите.
Короче, пишите проще.
вторник, 16 января 2007 г.
Java Puzzle 5: The Joy of Hex
Чему равно 0x100000000L + 0xCAFEBABE?
Прикол в том, что второе число типа int и расширяется знаковым разрядом до следующего long: 0x0000000100000000L + 0xFFFFFFFFCAFEBABEL = 0x00000000CAFEBABE.
Чему равно 0x100000000L + 0xCAFEBABEL?
В результате получим ожидаемое 0x00000001CAFEBABE.
Авторы дают совет избегать вычислений с аргументами разных типов.
Прикол в том, что второе число типа int и расширяется знаковым разрядом до следующего long: 0x0000000100000000L + 0xFFFFFFFFCAFEBABEL = 0x00000000CAFEBABE.
Чему равно 0x100000000L + 0xCAFEBABEL?
В результате получим ожидаемое 0x00000001CAFEBABE.
Авторы дают совет избегать вычислений с аргументами разных типов.
Футураметр
Результат теста «На кого из героев „Футурамы“ ты похож»:
Если Вы желаете узнать больше о своем характере и о характере героев «Футурамы», то прочитайте статью «Псих-о-рама».
Пройти тест.
Проф. | Лила | Гермес | Бендер | Зойдберг | Фрай | Эми | Киф | Зепп |
1 | 4 | -1 | 3 | 4 | 0 | 7 | 3 | 3 |
Если Вы желаете узнать больше о своем характере и о характере героев «Футурамы», то прочитайте статью «Псих-о-рама».
Пройти тест.
Java Puzzle 4: It's Elementary
Тут авторы советуют всегда использовать заглавную букву L для long-литералов: 5432L вместо 5432l, которое похоже на 54321. Я давно пишу заглавные буквы в long- и float-литералах, а также в шестнадцатиричной записи: 0xABCD вместо 0xabcd.
Так же они рекомендуют избегать однобуквенного идентификатора l, который легко спутать с единицей. Это правило меня не касается, так как я всегда предпочитаю использовать длинные названия, содержащие какой-либо смысл. Однобуквенные идентификаторы, которые я использую: x, y, z для координат и i, j, k... для счетчиков циклов.
Так же они рекомендуют избегать однобуквенного идентификатора l, который легко спутать с единицей. Это правило меня не касается, так как я всегда предпочитаю использовать длинные названия, содержащие какой-либо смысл. Однобуквенные идентификаторы, которые я использую: x, y, z для координат и i, j, k... для счетчиков циклов.
Java Puzzle 3: Long Division
Когда работаете с большими числами, ищите переполнение. Приведенный пример показывает, что часто это случается с умножением и делением чисел, а также с неявным преобразованием:
public class LongDivision {
final long MICROS_PER_DAY = 24 * 60 * 60 * 1000;
final long MILLIS_PER_DAY = 24 * 60 * 60 * 1000 * 1000;
public static void main(String[] args) {
System.out.println(MICROS_PER_DAY / MILLIS_PER_DAY);
}
}
public class LongDivision {
final long MICROS_PER_DAY = 24 * 60 * 60 * 1000;
final long MILLIS_PER_DAY = 24 * 60 * 60 * 1000 * 1000;
public static void main(String[] args) {
System.out.println(MICROS_PER_DAY / MILLIS_PER_DAY);
}
}
Подписаться на:
Сообщения (Atom)