Приведение несовместимых типов

Несмотря на всю полезность неявных преобразований типов, они неспособны удовлетворить все потребности в программировании, поскольку допускают лишь расширяющие преобразования совместимых типов. А во всех остальных случаях приходится обращаться к приведению типов. Приведение — это команда компилятору преобразовать результат вычисления выражения в указанный тип. А для этого требуется явное преобразование типов. Ниже приведена общая форма приведения типов.

(целевой_тип) выражение

Здесь целевой_тип обозначает тот тип, в который желательно преобразовать указанное выражение. Рассмотрим для примера следующее объявление переменных.

double х, у;

Если результат вычисления выражения х/у должен быть типа int, то следует записать следующее.

(int) (х / у)

Несмотря на то что переменные х и у относятся к типу double, результат вычисления выражения х/у преобразуется в тип int благодаря приведению. В данном примере выражение х/у следует непременно указывать в скобках, иначе приведение к типу int будет распространяться только на переменную х, а не на результат ее деления на переменную у. Приведение типов в данном случае требуется потому, что неявное преобразование типа double в тип int невозможно.

Если приведение типов приводит к сужающему преобразованию, то часть информации может быть потеряна. Например, в результате приведения типа long к типу int часть информации потеряется, если значение типа long окажется больше диапазона представления чисел для типа int, поскольку старшие разряды этого числового значения отбрасываются. Когда же значение с плавающей точкой приводится к целочисленному, то в результате усечения теряется дробная часть этого числового значения. Так, если присвоить значение 1,23 целочисленной переменной, то в результате в ней останется лишь целая часть исходного числа (1), а дробная его часть (0,23) будет потеряна.

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

// Продемонстрировать приведение типов.

using System;

class CastDemo {

  static void Main() {

    double x, y;

    byte b;

    int i;

    char ch;

    uint u;

    short s;

    long l;

    x = 10.0;

    y = 3.0;

    // Приведение типа double к типу int, дробная часть числа теряется,

    i = (int)(x / y) ;

    Console.WriteLine("Целочисленный результат деления х / у: " + i) ;

    Console.WriteLine();

    // Приведение типа int к типу byte без потери данных,

    i = 255;

    b = (byte)i;

    Console.WriteLine("b после присваивания 255: " + b + " -- без потери данных.");

    // Приведение типа int к типу byte с потерей данных,

    i = 257;

    b = (byte)i;

    Console.WriteLine("b после присваивания 257: " + b + " — с потерей данных.");

    Console.WriteLine();

    // Приведение типа uint к типу short без потери данных,

    u = 32000;

    s = (short) u;

    Console.WriteLine("s после присваивания 32000: " + s + " — без потери данных.");

    // Приведение типа uint к типу short с потерей данных,

    u = 64000;

    s = (short)u;

    Console.WriteLine("s после присваивания 64000: " + s + " — с потерей данных. ") ;

    Console.WriteLine();

    // Приведение типа long к типу uint без потери данных.

    l = 64000;

    u = (uint)l;

    Console.WriteLine("и после присваивания 64000: " + u + " -- без потери данных.");

    // Приведение типа long к типу uint с потерей данных.

    l = -12;

    u = (uint)1;

    Console.WriteLine("и после присваивания -12: " + u + " — с потерей данных.");

    Console.WriteLine();

    // Приведение типа int к типу char,

    b = 88; // код ASCII символа X

    ch = (char) b;

Перейти на страницу:

Похожие книги