- •Информационные преобразования числовых форматов
- •Позиционные системы счисления
- •Преобразования целых чисел в двоичной и десятичной системах счисления
- •Коды двоичных целых чисел
- •1. Знаковый прямой код целого числа.
- •2. Обратный код целого числа.
- •3. Дополнительный код целого числа.
- •Битовое отображение целого числа
- •Преобразования вещественных чисел в двоичной и десятичной системах счисления
- •Нормальная форма вещественного числа
- •Преобразование вещественного числа в целое число
- •Преобразование целого числа в вещественное число
- •Фиксированный вещественный формат
- •Символьные преобразования числовой информации
- •Список литературы
- •Оглавление
Преобразование вещественного числа в целое число
Математические действия тривиальны, поскольку необходимо только отбросить дробную часть вещественного числа. Число меньше 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.