Внутренне в Java примитивные логические значения рассматриваются как -1? - PullRequest
0 голосов
/ 24 ноября 2011

На днях на форуме у меня была дискуссия о примитивных логических типах данных.И один парень сказал, что в ALL языках true внутренне (или изначально) трактуется как -1.Это действительно так?

PD: Мы специально говорили о Java

Ответы [ 7 ]

11 голосов
/ 24 ноября 2011

Это на самом деле часть спецификации JVM, по крайней мере, в определенных терминах - и это , а не -1. В разделе 3.3.4 спецификации сказано следующее:

Хотя виртуальная машина Java определяет логический тип, она обеспечивает очень ограниченную поддержку. Нет никаких инструкций виртуальной машины Java, предназначенных исключительно для операций над логическими значениями. Вместо этого выражения на языке программирования Java, которые работают с логическими значениями, компилируются для использования значений виртуальной машины Java int тип данных.

Виртуальная машина Java напрямую поддерживает логические массивы. Его инструкция newarray позволяет создавать логические массивы. Доступ к массивам типа boolean и их изменение осуществляется с помощью инструкций байтового массива baload и bastore.2

Виртуальная машина Java кодирует компоненты логического массива, используя 1 для представления true и 0 для представления false. Если логические значения языка программирования Java отображаются компиляторами на значения типа виртуальной машины Java типа int, компиляторы должны использовать одну и ту же кодировку.

Как пример этого:

public static boolean returnFalse() {
    return false;
}

public static boolean returnTrue() {
    return true;
}

компилируется в:

public static boolean returnFalse();
  Code:
     0: iconst_0
     1: ireturn

public static boolean returnTrue();
  Code:
     0: iconst_1
     1: ireturn
3 голосов
/ 24 ноября 2011

Нет, это не правда. В C любое ненулевое значение будет интерпретироваться как true в логическом контексте, но такие операции, как == и &&, возвращают 1 для true. В Python True отличается от любого целого числа, но True == 1 возвращает True; в более старых версиях использовалось 1. Я думаю, что -1 является традиционным в семье Бейсиков; конечно, это имело место в QBasic и Visual Basic Visual Basic.

В Java true не "обрабатывается как" -1 ... логические значения и целые числа - это отдельные типы, которые нельзя сравнивать. Внутреннее представление зависит от реализации.

0 голосов
/ 24 ноября 2011

На самом деле единственным языком, который мне известен, который использовал -1 как истину, был VARIANT_BOOL ребята из Visual Basic.И они сделали это только из-за ограничений в языке (только наличие побитовых логических операций не оказалось такой хорошей идеей, на которую я бы поставил).

0 голосов
/ 24 ноября 2011

-1 может быть результатом того, что значение дополнения до двух, равное -1, представляет собой все установленные биты. Фактическая занятость памяти зависит от JVM и может быть от 32-разрядного до 32-разрядного целого числа. Насколько я помню, большинство JVM-моделей логические как целые числа.

0 голосов
/ 24 ноября 2011

Низкоуровневое внутреннее представление логических выражений является проблемой, специфичной для платформы. Однако, поскольку Java обычно (всегда?) Реализуется с использованием C / C ++, логические значения, скорее всего, представлены так же, как обрабатываются логические значения в C / C ++. А именно, 0 определяется как FALSE, а все остальное определяется как TRUE.

0 голосов
/ 24 ноября 2011

Это зависит от реализации JVM.

0 голосов
/ 24 ноября 2011

Я не знаю о ALL языках, но в Java логическое значение отличается от числовых значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...