В чем разница между typecasting и typeconversion в С++ или java?

В чем разница между typecasting и typeconversion в С++ или java?

Ответы

Ответ 1

Тип литье обрабатывает значение (блок памяти), на которое ссылается переменная, как тип другого типа, чем тип, объявленный как.

Тип преобразование фактически выполняет преобразование этого значения.

На многих языках некоторые приведения (обычно числовые) приводят к конверсиям (это будет несколько отличаться от языка), но в основном это просто "обрабатывает этот X как Y".

Как и большинство аспектов человеческого языка, к сожалению, термины используются несколько иначе в разных сообществах, в основном по языковым линиям. Например, см. Комментарий Джеймса ниже о С++ — слово "cast" имеет гораздо более широкое значение, чем приведенное выше определение, которое больше в форме C или Java. И просто для того, чтобы сделать что-то интересное, Java Language Spec фактически попадает в различные виды трансляций, в том числе кастинг конверсий. Но выше это хорошее эмпирическое правило.

Но взять простой случай:

В Java перед дженериками было необычно делать много приведения при работе с картами:

Map m = new HashMap();
m.put("one", "uno");

// This would give a compiler error, because although we know
// we'll get a String back, all the compiler knows is that it's
// an Object
String italian = m.get("one");

// This works, we're telling the compiler "trust me, it a String"
String italian = (String)m.get("one");

К счастью, добавление generics касалось этого, так как кастинг таким образом имеет тенденцию быть хрупким процессом с проблемами обслуживания.

В отличие от этого, вы бы конвертировали, если бы у вас была строка цифр:

String s = "1234";

... и нужно знать, сколько цифр эти цифры представлены в десятичной форме:

// Wrong (cast)
int n = (int)s;

// Right (conversion)
int n = Integer.parseInt(s, 10);

Ответ 2

Typecasting просто берет перо и записывает "это теперь int" в переменной, преобразование на самом деле конвертирует содержимое в желаемый тип, чтобы значение сохраняло смысл.

Ответ 3

Может быть, пример может помочь:

  • Если вы добавили 33 в строку, вы получите "!".
  • Если вы преобразуете 33 в строку, вы получите "33".

[Примечание: этот пример делает всевозможные необязательно-допустимые предположения о кодировании и представлениях чисел и строк в памяти, но я надеюсь, что механизм ясен.]

Ответ 4

Преобразование типов:

double value = 3; // implicit conversion to double value 3.0
int nValue = 3.14156; // implicit conversion to integer value 3

Кастинг - это запрос программиста для явного преобразования типов.

int nValue = 10;
double dvalue = double(nValue); // explicit type casting

Ответ 5

Термины часто используются взаимозаменяемо.

Java

Тип casting и преобразование типов - одно и то же в Java, хотя, если кто-то говорит, что они кастуют, они обычно ссылаются на явное преобразование.

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

С++

Тип и литье типов различаются в С++. В С++ существует пять типов трансляций, которые имеют различное поведение: static_cast, dynamic_cast, reinterpret_cast, const_cast и c-style casts ((int)someVariable).

Некоторые кавычки С++ выполняют преобразование типов (следовательно, почему это понятие запутывает), вызывая код и потенциально проверяя время выполнения. Другие слияния С++ просто подделывают изменение типа ссылочной переменной - никакая память не будет изменена, перемещена или скопирована, поэтому результирующий тип данных может быть неправильно преобразован. Это может обеспечить большую скорость во время выполнения и может быть мощным инструментом для низкоуровневого кода, но для кода высокого уровня его обычно избегают.

Обратите внимание, что синтаксис синтаксиса c-стиля (который выглядит точно так же, как синтаксис Java) является одним из приведений, которые не обязательно будут вызывать код преобразования.

Преобразование типов в С++ часто относится к вызову конструктора копирования или оператора присваивания, который копирует данные в новый экземпляр другого класса/структуры. Если тип имеет определенные операторы преобразования, то синтаксис преобразования может выглядеть как литье или просто прямое назначение. Основное различие здесь заключается в том, что код вызывается для преобразования.

Ответ 6

В статье Wikipedia :

"В семействе языков C слово cast обычно ссылается на явное преобразование типа (в отличие от неявного преобразования), независимо от того, является ли это повторной интерпретацией битового шаблона или реального преобразования".

Вот пример С++:

double d = 42.0;
int i = d; // Here you have an implicit conversion from double to int
int j = static_cast<int>(d); // Here you have a cast (explicit conversion).

Вот пример Java (обратите внимание, что в Java в отличие от С++ вы не можете неявно преобразовывать из double в int):

int i = 42;
double d = i; // Here you have an implicit conversion from int to double
int j = (int)d; // Here you have a cast (explicit conversion).

Ответ 7

От объекта к примитиву → Преобразование типов

String s = "1234";
int i = Integer.parseInt(s);
int j = Integer.valueOf(s);

От примитива к объекту → Преобразование типов

int i = 55;
String s = String.valueOf(i);
String t = Integer.toString(i);

От примитива к примитивному (или объекту к объекту) → Тип литья (явный при сужении и неявный при расширении)

//explicit  
double d = 3.14156;
int i = (int)d; 
//implicit
int i = 100;
double d = i;

Примечание. В случае кастомизации типа объекта мы не можем использовать ссылку на дочерний класс для хранения родительского объекта

Ответ 8

Если вы сконцентрируетесь на Java и числовых типах, то, по словам Javadoc, я думаю, что основными различиями между приведением типов и преобразованием типов являются:

  • без потери информации и точности (преобразование типов)
  • потеря точности (преобразование типов)
  • потеря информации (тип приведения)

Чтобы рассмотреть более подробно, во-первых (без потери информации и точности), преобразование может быть сделано без потери информации и точности. Эти преобразования включают: byte в short, short в int, char в int, int в long, int в double и, наконец, с плавающей точкой в удвоение. Например:

byte b = 2;
System.out.println(b); 
short s = b; // without information and precision loss (type conversion)
System.out.println(s);

результат:

    2
    2

Во-вторых (потеря точности), преобразование выполняется с потерей точности, это означает, что значение результата имеет правильную величину, однако с потерей точности. Эти преобразования включают: int, чтобы плавать, долго плавать и долго удваиваться. Например:

long l = 1234567891;
System.out.println(l); 
double d = l; // precision loss (type conversion)
System.out.println(d);

результат:

    1234567891
    1.234567891E9

В-третьих (потеря информации), преобразование выполняется через потерю информации, это означает, что вы приводите значения, поэтому он имеет собственный синтаксис. Эти преобразования включают: double в long, double to int и так далее. Например:

double d = 1.2;
System.out.println(d); 
long l = (long) d; // information loss
System.out.println(l);

результат (дробная часть опущена):

    1.2
    1