Московский государственный университет имени М.В.Ломоносова
Опубликован: 01.11.2004 | Доступ: свободный | Студентов: 11271 / 455 | Оценка: 4.12 / 4.01 | Длительность: 19:20:00
ISBN: 978-5-9556-0077-9
Специальности: Программист
Лекция 6:

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

< Лекция 5 || Лекция 6: 123456 || Лекция 7 >

Представление целых и вещественных типов данных

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

Целочисленное значение типа integer, записанное как "signed 32-bit", может иметь в памяти компьютера следующее представление:

Битовая структура типа integer

Рис. 6.1. Битовая структура типа integer

Целочисленное значение типа shortint, записанное как " signed 8-bit ", может иметь в памяти компьютера следующее представление:

Битовая структура типа shortint

Рис. 6.2. Битовая структура типа shortint

Максимально допустимое значение, которое можно записать в 7 бит - это восьмеричное число 177, которое в десятичном исчислении равно 127 (1778=1*82+7*81+7*80=12710).

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

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

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

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

Вещественное значение с плавающей точкой может иметь в памяти компьютера следующее представление:

Битовая структура типа float

Рис. 6.3. Битовая структура типа float

Для представления вещественных чисел с плавающей точкой и вещественных чисел двойной точности с плавающей точкой стандартом IEEE 754 определены 32- и 64-битовые представления соответственно.

В разряды мантиссы записываются значащие цифры, а в разряды экспоненты заносится показатель степени. Положительные значения содержат в знаковом бите числа - 0, а отрицательные значения - 1.

При обозначении чисел с плавающей точкой приняты следующие соглашения: знаковый разряд обозначается буквой s, экспонента - e, а мантисса - m.

В языке Java значения с плавающей точкой могут объявляться следующими базовыми типами:

  • float диапазон значений от +3.40282347E+28 до +1.40239846E-45 (32 бита)
  • double диапазон значений от +1.79769313486231579E+308 до +4.9406545841246544E-324 (64 бита).

Полной ненулевой формой значения типа float является форма s·m·2e, где s это +1 или -1 (знаковый бит числа), m является положительным значением, меньшим, чем 224 (мантисса), и нe является целым в пределах от -149 до 104 включительно (экспонента).

Полной ненулевой формой значения типа double является форма s·m·2e, где s это +1 или -1, m является положительным значением, меньшим, чем 253, и нe является целым в пределах от -1045 до 1000 включительно.

Положительным нулевым значением и отрицательным нулевым значением являются 0.0 и -0.0 (0.0 == -0.0 дает в результате true ), но некоторые операторы различают эти "эквивалентные" значения, например, 1.0/0.0 равно положительной бесконечности, а 1.01/-0.0 - отрицательной бесконечности.

В языке Java приняты следующие правила приведения вещественных типов:

  • любые значения любого типа с плавающей точкой могут быть приведены к любому другому значению числового типа;
  • любые значения любого типа с плавающей точкой могут быть приведены к значению типа char и наоборот;
  • приведение невозможно между значениями типа boolean и значениями с плавающей точкой.

Если оба операнда имеют тип float, или один имеет тип float, а другой - целый тип, то результат будет иметь тип float.

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

Операции со значениями с плавающей точкой не выдают исключений.

При вычислениях значений с плавающей точкой следует учитывать правила округления. Так например, для значений с плавающей точкой выражение1.0*10 не равно значению 10. Это иллюстрирует следующий пример на языке Java:

public class MyFloatSumma   
{ public static void main(String[] args)
  {
  float f1 = (float) 1.0;	
    // Число с плавающей точкой
  float fSum = 0;	 
    // Переменная для записи результата
  final static float myDeltaFloat = 
      (float) 0.00001;
    // Дельта для "усечения"
	// мусора мантиссы
  
  // Способ вычисления - простое 
  // суммирование и сравнение
    for (byte i=0; i<10; i++) 
	   fSum = fSum + (float) 0.1; 
	   // Цикл от 0 до 10
			
	if (f1 == fSum) 
	  // Сравнение (float) 1.0 и 
	  // полученной суммы
	System.out.println("Числа равны");
	else
	System.out.println("Числа различны");
// Правильный способ вычисления - 
// с "усечением" мусора мантиссы
    fSum = 0;	
    for (byte i=0; i<10; i++)  
	    fSum = fSum + (float) 0.1;
	if (Math.abs(fSum - f1) < myDeltaFloat)
	System.out. println("Числа одинаковы");
	else
	System.out. println("Числа различны");
  }
}
< Лекция 5 || Лекция 6: 123456 || Лекция 7 >
Александр Демьяненко
Александр Демьяненко

Можно ли сдавать один и тот же тест несколько раз?
Или же один и тот же тест можно сдать лишь однажды?

Максим Стогний
Максим Стогний

Добрый день!

Скажите, пожалуйста, если в терминологии объектно-ориентированного программирования функции также называются методами или методами - членами класса, в примере объявления указателя на метод использовали в формальном описании оба названия:

тип_метода (имя_класса::*имя_метода_указателя)
    (список параметров);
тип_функции (*имя_ функции_указателя)
    (список параметров);

при этом можно было  тип_функции во втором описании заменить на тип_метода? Т.е.:

тип_метода (*имя_ метода_указателя)
    (список параметров);