Информационные преобразования числовых форматов (96
..pdfint p = |
t - 127; |
// математический порядок - 1 |
|
printf( |
"\np = %d", |
p ); |
// монитор |
DWORD m = ( ( u.n << 8 ) | 0x80000000);//мантисса DWORD z = m >> ( 31 – p -r);//фиксированное число
BinaryInt( "z = ", z);//бинарный вид модуля числа z |= ( u.n & 0x80000000 ) >> ( 31 - ( size-1 ) ); BinaryInt( "z = ", z );// бинарный вид результата
return z; |
// вернуть фиксированное число |
} |
|
//--------------------------------------------------- |
|
void main ( void ) |
// образец результата |
{ float f; |
|
printf( "f = " ); scanf( "%f", &f );// ввод числа |
BinaryFloat( "f = ", f ); // бинарный вид образца unsigned int x = FloatFixed( f, 12, 4 );
printf( "\nx = %x", x ); // шестнадцатеричный вид
BinaryInt( "x = ", x );// бинарный вид результата
getch(); |
// просмотр результата |
} |
|
Если после запуска программы C6 ввести число –6.25, то на мониторе появляется следующий результат:
f = –6.25
t = 00000000000000000000000010000001 p = 2
z = 00000000000000000000000001100100 z = 00000000000000000000010001100100 x = 864
x = 00000000000000000000010001100100
10. СИМВОЛЬНЫЕ ПРЕОБРАЗОВАНИЯ ЧИСЛОВОЙ ИНФОРМАЦИИ
Число, введенное с клавиатуры, преобразуется компьютером в последовательность символов, которые затем оказываются в символьном массиве. И наоборот, перед выводом числа на монитор функции, аналогичные, например, printf(), выполняют пре-
21
образования из внутренних форматов целого и вещественного представления числа в соответствующую последовательность символов. В этом разделе рассматриваются возможные варианты реализации таких преобразований.
Рассмотрим пример программы C7, в которой целое положительное число переводится из формата unsigned int в формат символьного массива. Каждый символ отображает один бит исходного числа. В программе применяется технологический прием рекурсивной функции IntChar(). Это удобный прием для теории программирования, однако в приложениях он не всегда находит применение, поскольку реализация рекурсивной функции сопровождается значительными временными затратами, связанными с размещениями очередного экземпляра вызова функции IntChar() в стеке параметров операционной системы. Задача функции IntChar() в некотором смысле совпадает с назначением ранее обсуждавшейся функции BinaryInt(), которая не является рекурсивной. Разница лишь в том, что в функции BinaryInt() получается результат на мониторе, в функции IntChar() – в массиве.
Программа С7:
//Program C7
//Символьный вид положительного целого числа
//Рекурсивная функция
#include <stdio.h> |
|
// printf, scanf |
#include <conio.h> |
|
// getch |
#include <string.h> |
|
// strcat_s |
void IntChar( unsigned int n, char* s |
) |
|
{ if( n > 1 ) IntChar( n >> 1, s ); |
// поиск |
|
( n & 1 ) == 0 |
? strcat_s( s, 32, |
"0" ) |
} |
: strcat_s( s, 32, "1" ); |
|
|
|
//---------------------------------------------------
void main( void )
{ unsigned int n; // для целого числа char s[32] = { '\0' };// пустой символьный массив printf( "n = " ); scanf( "%d", &n );// ввод числа
IntChar( n, s);//символьный массив двоичного кода
printf( "st = %s", s ); |
// монитор |
getch(); |
// просмотр результата |
}
22
Если при выполнении программы C7 ввести произвольное целое число, например 37, то на мониторе появляются следующие строки:
n = 37
s = 100101
Рассмотрим пример программы C8, в которой положительное десятичное целое число вводится с клавиатуры в массив и затем преобразуется в двоичное число типа unsigned int. Идея алгоритма состоит в том, что каждая цифра десятичного числа умножается на соответствующий позиционный коэффициент: 110 = 12 , 1010 = 10102 , 10010 = 11001002 и т. д. Эти коэффициенты
можно найти путем умножения предыдущего коэффициента на 10. Получающиеся значения полиномиально складываются (1).
Программа С8:
//Program C8
//Преобразование целого положительного десятичного
//числа из символьного вида в тип unsigned int
#include <stdio.h> |
|
// printf |
#include <conio.h> |
|
// getch |
unsigned int CharInt( char* s ) |
||
{ int i; |
|
// индекс символа |
for( i = 0; s[i] != '\0'; i++ ); // конец строки |
||
int n = 0; |
|
// для результата |
int k = 1; |
|
// позиционный множитель |
for( --i; i >= 0; i--)//просмотр от младшей цифры |
||
{ int z = s[i] - 48; |
// цифра минус код '0' |
|
n += k * z; |
// позиционное накопление числа |
|
k *= 10; |
// множитель следующей позиции |
|
} |
|
// результат |
return n; |
|
|
} |
|
|
//---------------------------------------------------
void main( void )
{char s[32];// для символьного представления числа printf( "s = " ); scanf( "%s", s ); // ввод числа
23
printf( "s = %s", s ); // монитор unsigned int n = CharInt(s);//char - unsigned int
printf( "\nn = %d", n ); |
// монитор |
getch(); |
// просмотр результата |
}
Если при выполнении программы C8 ввести произвольное число, например. 37, то на мониторе появляются следующие строки:
s = 37 s = 37 n = 37
СПИСОК РЕКОМЕНДУЕМОЙ ЛИТЕРАТУРЫ
Коган С. Программирование на языке С: Пер. с англ. М.: Изд. дом «Вильямс», 2007. 496 с.
Прата С. Язык программирования С++: Лекции и упражнения: Пер. с англ. М.: Изд. дом «Вильямс», 2007. 1187 с.
24
|
ОГЛАВЛЕНИЕ |
|
Введение................................................................................................... |
3 |
|
1. |
Позиционные системы счисления..................................................... |
4 |
2. |
Преобразования целых чисел в двоичной и десятичной системах |
|
|
счисления............................................................................................ |
5 |
3. |
Коды двоичных целых чисел.............................................................. |
7 |
4. |
Битовое отображение целого числа................................................... |
9 |
5. |
Преобразования вещественных чисел в двоичной и десятичной |
|
|
системах счисления............................................................................ |
10 |
6. |
Нормальная форма вещественного числа........................................ |
11 |
7. |
Преобразование вещественного числа в целое число ..................... |
14 |
8. |
Преобразование целого числа в вещественное число ..................... |
16 |
9. |
Фиксированный вещественный формат........................................... |
17 |
10. Символьные преобразования числовой информации ................... |
21 |
|
Список рекомендуемой литературы ...................................................... |
24 |
25