Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информационные преобразования числовых форматов....doc
Скачиваний:
3
Добавлен:
13.11.2018
Размер:
333.31 Кб
Скачать

Преобразование вещественного числа в целое число

Математические действия тривиальны, поскольку необходимо только отбросить дробную часть вещественного числа. Число меньше 1 всегда имеет целую часть 0. Ниже представлена программа C3, в которой функция FloatInt( ) анализирует порядок нормализованной вещественной переменной типа float и возвращает целую часть числа типа int. Два подключаемых файла #include "BinaryInt.h" и #include "BinaryFloat.h" содержат функции вывода на монитор целых BinaryInt( ) и вещественных BinaryFloat() чисел, взятых соответственно из программ C1 (стр. 11) и C2 ( стр. 17).

// Program C3

// Преобразование float - int

#include <stdio.h> // printf

#include <conio.h> // getch

#include "BinaryInt.h" // BinaryInt

#include "BinaryFloat.h" // BinaryFloat

int FloatInt( float ff )

{ union

{ unsigned int n; // поле целого типа

float f; // поле вещественного типа

} u; // объект объединения

u.f = ff; // загрузить объединение

if( ( u.n << 1 ) == 0 ) return 0; // число 0

unsigned int t = u.n << 1 >> 24; // порядок Intel

BinaryInt( "t = ", t ); // бинарный вид порядка

int p = t - 127; // математический порядок - 1

printf( "\np = %d", p ); // монитор

if( p < 0 ) return 0; // число < 1

// модуль мантиссы

unsigned int z = ( ( u.n << 8 ) | 0x80000000 ) >>

( 31 – p );

BinaryInt( "z = ", z );// бинарный вид результата

if( u.n & 0x80000000 ) z = ~z + 1;//отрицательное

BinaryInt( "z = ", z );// бинарный вид результата

return z; // вернуть результат

}

//---------------------------------------------------

void main ( void )

{ float f; // 4-байтная вещественная переменная

printf( "f = " ); scanf( "%f", &f );//ввод числа

BinaryFloat( "f = ", f ); // бинарный вид числа

int k = FloatInt( f );//преобразование float-int

printf( "\nk = %d", k ); // монитор

getch(); // просмотр результата

}

Если при выполнении программы C3 ввести число -6.25, то следующие строки появляются на мониторе

f = 6.25

f = 11000000110010000000000000000000

t = 00000000000000000000000010000001

p = 2

z = 00000000000000000000000000000110

z = 11111111111111111111111111111010

k = -6

Функция FloatInt( ) возвращает целую часть вещественного числа в дополнительном коде типа int. Конструкция объявления параметров содержит значение вещественного числа типа float ff. В теле функции FloatInt( ) находится объявление объекта объединения

union

{ unsigned int n; // поле целого типа

float f; // поле вещественного типа

} u // объект объединения

поле u.f которого используется для выполнения дальнейших битовых преобразований. Значение вещественного числа, заданного в параметре ff копируется в объект объединения u.f = ff. Исходное число сдвигается на один бит влево u.n << 1, чтобы убрать знак мантиссы. Если получается нулевой порядок и нулевая мантисса, то функция FloatInt( ) может вернуть ноль if( ( u.n << 1 ) == 0 ) return 0.

Чтобы получить компьютерный порядок вещественного числа, можно с помощью сдвига влево удалить знак мантиссы, а затем все биты сдвинуть на 24 бита вправо unsigned int t = u.n << 1 >> 24. Подтвердим результат на мониторе BinaryInt( "t = ", t ). На единицу меньше получается математический порядок p после вычитания int p = t – 127. Значение p выводится на монитор printf( "\np = %d", p ) для контроля. Если порядок , то число не имеет целой части if( p < 0 ) return 0. Зная порядок, не трудно получить модуль целой части числа unsigned int z = ( ( u.n << 8 ) | 0x80000000 ) >> ( 31 – p ) с помощью сдвига влево u.n << 8, чтобы удалить порядок, дизъюнкции 1 в в 31-ом бите ( u.n << 8 ) | 0x80000000, чтобы восстановить спрятанную единицу, и сдвига вправо на 31 – p бит. Модуль мантиссы отображается на мониторе BinaryInt( "z = ", z ). Если вещественное число ff отрицательное и содержит 1 в 31-ом бите, полученную целую часть следует перевести в дополнительный код if( u.n & 0x80000000 ) z = ~z + 1. Результат отображается на мониторе BinaryInt( "z = ", z ). Функция FloatInt( ) возвращает результат return z.