Программирование >>  Обработка исключительных ситуаций 

1 ... 7 8 9 [ 10 ] 11 12 13 ... 142


хранятся цифры мантиссы 381 и порядок 4, для числа 560,3 10 - мантис 5603 и порядок 5 (мантисса нормализуется), а число 0,012 представлено как 12 и Конечно, в этом примере не учтены система счисления и другие особенност

Все вещественные типы могут представлять как положительные, так и отрив тельные числа. Чаще всего в программах используется тип double, поскольку е диапазон и точность покрывают большинство потребностей. Этот тип имеют i щественные литералы и многие стандартные математические функции.

ПРИМЕЧАНИЕ-

Обратите внимание на то, что при одинаковом количестве байтов, отводимых г величины типа f 1 oat и i nt, диапазоны их допустимых значений сильно различав ся из-за внутренней формы представления. То же самое относится к 1 ong и doub

Тип decimal предназначен для денежных вычислений, в которых критичны они ки округления. Как видно из табл. 2.5, тип float позволяет хранить однов} менно всего 7 значащих десятичных цифр, тип double - 15-16. При вычислени ошибки округления накапливаются, и при определенном сочетании значений ; даже может привести к результату, в котором не будет ни одной верной значат цифры! Величины типа decimal позволяют хранить 28-29 десятичных разряд

Тип decimal не относится к вещественным типам, у них различное внутрею представление. Величины денежного типа даже нельзя использовать в одном ъ ражении с вещественными без явного преобразования типа. Использование личин финансового типа в одном выражении с целыми допускается.

Любой встроенный тип С# соответствует стандартному классу библиотеки .N1 определенному в пространстве имен System. Везде, где используется имя встроен] го типа, его можно заменить именем класса библиотеки. Это значит, что у вст: енных типов данных С# есть методы и поля. С их помощью можно, наприм получить минимальные и максимальные значения для целых, символьных, <j нансовых и вещественных чисел:

double.MaxValue (или System.Doublе.MaxValue) - максимальное число типа dout

uint.MinValue (или System.UInt32.MinValue) - минимальное число типа u1

ПРИМЕЧАНИЕ-

Интересно, что в вещественных классах есть элементы, представляющие по жительную и отрицательную бесконечности, а также значение не число - Positivelnfinity, Negativelnfinity и NaN соответственно. При выводе на эк] например, первого из них получится слово бесконечность . Все доступные ; менты класса можно посмотреть в окне редактора кода, введя символ точки ct после имени типа.

Типы литералов

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



ипы данных

nt, иначе он относится к наименьшему из типов uint, long или ulong, в диапазон начений которого он входит. Вещественные литералы по умолчанию относятся типу double.

1апример, константа 10 относится к типу i nt (хотя для ее хранения достаточно [ байта), а константа 2147483648 будет определена как ui nt. Для явного задания ипа литерала служит суффикс, например, 1. If, 1UL, 1000m (все суффиксы пере-ислены в табл. 2.3). Явное задание применяется в основном для уменьшения :оличества неявных преобразований типа, выполняемых компилятором.

Гипы-значения и ссылочные типы

1аще всего типы С# разделяют по способу хранения элементов на типы-значения [ ссылочные типы (рис. 2.2) . Элементы типов-значений , или значимых типов value types), представляют собой просто последовательность битов в памяти, [еобходимый объем которой выделяет компилятор. Иными словами, величины начимых типов хранят свои значения непосредственно. Величина ссылочного чипа хранит не сами данные, а ссылку на них (адрес, по которому расположены [энные). Сами данные хранятся в хипе.

(НИМАНИЕ-

Несмотря на различия в способе хранения, и типы-значения, и ссылочные типы являются потомками общего базового класса object.


вещественные финансовый символьный

Object

массивы строки string

классы интерфейсы

делегаты

I--\

Структуры

Рис. 2.2. Классификация типов данных С# по способу хранения

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

Встроенные типы на рисунке выделены полужирным шрифтом, простые типы подчеркнуты.



одни и те же данные (на рисунке b и с равны, но а не равно b даже при одинаковых значениях). Из этого следует, что если изменить значение одной величины ссылочного типа, это может отразиться на другой.

Значение

Значение

Стек

Значение

Значение

Ссылка

Ссылка

Ссылка

Рис. 2.3. Хранение в памяти величин значимого и ссылочного типов

Обратите внимание на то, что не все значимые типы являются простыми. По другой классификации структуры и перечисления относятся к структурированным типам, определяемым программистом. Мы рассмотрим эти типы в главе 9. Ссылочные типы мы будем изучать в главе 5 и последующих главах, после основных операторов С#, когда вы освоите синтаксис языка, а до этого ограничимся использованием встроенных типов-значений. Типы nullable введены в версию С# 2.0 и рассматриваются в главе 13.

Упаковка и распаковка

Для того чтобы величины ссылочного и значимого типов могли использоваться совместно, необходимо иметь возможность преобразования из одного типа в другой. Язык С# обеспечивает такую возможность. Преобразование из типа-значения в ссылочный тип называется упаковкой (boxing), обратное преобразование - распаковкой (unboxing).

Если величина значимого типа используется в том месте, где требуется ссылочный тип, автоматически выполняется создание промежуточной величины ссылочного типа: создается ссылка, в хипе выделяется соответствующий объем памяти и туда копируется значение величины, то есть значение как бы упаковывается в объект. При необходимости обратного преобразования с величины ссылочного типа снимается упаковка , и в дальнейших действиях участвует только ее значение.

Рекомендации по программированию

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



1 ... 7 8 9 [ 10 ] 11 12 13 ... 142

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика