Загрузка данных
1 ХОД ВЫПОЛНЕНИЯ РАБОТЫ
1.1 Создание функции вывода битов
Для выполнения задания была создана функция print_bits_simple, которая выводит битовое представление любого участка памяти.
```c
void print_bits_simple(void *data, int size) {
unsigned char *p = (unsigned char*)data;
for (int i = size - 1; i >= 0; i--) {
for (int j = 7; j >= 0; j--) {
printf("%d", (p[i] >> j) & 1);
}
printf(" ");
}
printf("\n");
}
```
Принцип работы функции:
· На вход подается указатель на данные и их размер в байтах
· Указатель приводится к типу unsigned char* для побайтового доступа
· Внешний цикл проходит по байтам от старшего к младшему
· Внутренний цикл проходит по битам каждого байта от 7 к 0
· Каждый бит извлекается с помощью операции сдвига вправо и побитового И с 1
1.2 Объявление переменных разных типов
В соответствии с заданием были объявлены переменные следующих типов:
Целые числа (1 байт):
```c
char signed_char = -5; // знаковое
unsigned char unsigned_char = 5; // беззнаковое
```
Целые числа (2 байта):
```c
short int signed_short = -32768; // знаковое
unsigned short int unsigned_short = 32768; // беззнаковое
```
Целые числа (4 байта):
```c
int signed_int = -10; // знаковое
unsigned int unsigned_int = 10; // беззнаковое
```
Вещественные числа (4 байта):
```c
float float_num = 0.5f;
float float_negative = -1.0f;
```
Вещественные числа (8 байт):
```c
double double_num = 0.5;
```
1.3 Вывод битового представления
Для каждой переменной был организован вывод с поясняющей подписью:
```c
printf(" signed char (-5): ");
print_bits_simple(&signed_char, sizeof(signed_char));
```
Функция вызывается с передачей адреса переменной (оператор &) и её размера (оператор sizeof).
1.4 Запуск и проверка программы
Программа была скомпилирована и запущена. Все переменные успешно выведены в битовом представлении.
---
2 ТЕСТИРОВАНИЕ
2.1 Результаты выполнения программы
```
=== ЦЕЛЫЕ ЧИСЛА ===
1 байт (char):
signed char (-5): 11111011
unsigned char (5): 00000101
2 байта (short):
signed short (-32768): 10000000 00000000
unsigned short (32768): 10000000 00000000
4 байта (int):
signed int (-10): 11111111 11111111 11111111 11110110
unsigned int (10): 00000000 00000000 00000000 00001010
=== ВЕЩЕСТВЕННЫЕ ЧИСЛА ===
4 байта (float):
float (0.5): 00111111 00000000 00000000 00000000
float (-1.0): 10111111 10000000 00000000 00000000
8 байт (double):
double (0.5): 00111111 11100000 00000000 00000000 00000000 00000000 00000000 00000000
```
2.2 Объяснение полученных результатов
Целые числа
Однобайтовые числа:
· unsigned char (5): число 5 в двоичной системе = 00000101. Результат совпадает.
· signed char (-5): отрицательные числа хранятся в дополнительном коде. Для -5: инвертируем 00000101 → 11111010, прибавляем 1 → 11111011. Результат подтверждает это.
Двухбайтовые числа:
· unsigned short (32768): 32768 = 2^15 = 10000000 00000000.
· signed short (-32768): минимальное отрицательное число тоже имеет код 10000000 00000000.
Четырехбайтовые числа:
· unsigned int (10): 10 = 00000000 00000000 00000000 00001010.
· signed int (-10): в дополнительном коде -10 = 11111111 11111111 11111111 11110110.
Вещественные числа
Число 0.5 в формате float:
По стандарту IEEE 754:
· 0.5 = 1.0 × 2^(-1)
· Знак: 0
· Экспонента: -1 + 127 = 126 = 01111110
· Мантисса: 0
· Итог: 00111111 00000000 00000000 00000000
Число -1.0 в формате float:
· -1.0 = -1.0 × 2^(0)
· Знак: 1
· Экспонента: 0 + 127 = 127 = 01111111
· Мантисса: 0
· Итог: 10111111 10000000 00000000 00000000
Число 0.5 в формате double:
Аналогично float, но с 11-битной экспонентой (смещение 1023):
· Экспонента: -1 + 1023 = 1022 = 01111111110
· Итог: 00111111 11100000 00000000 ...
---
ЗАКЛЮЧЕНИЕ
В ходе выполнения лабораторной работы была разработана программа на языке C для вывода битового представления числовых данных различных типов.
Были достигнуты следующие результаты:
1. Разработана универсальная функция print_bits_simple, позволяющая выводить битовое представление любого участка памяти.
2. Продемонстрировано битовое представление целых чисел:
· Для положительных чисел используется прямой код
· Для отрицательных чисел используется дополнительный код
· Беззнаковые и знаковые числа одинаково хранятся в памяти, но по-разному интерпретируются
3. Продемонстрировано битовое представление вещественных чисел:
· Числа хранятся по стандарту IEEE 754
· Число представляется в виде знака, экспоненты и мантиссы
· Для типов float и double используются разные форматы
4. Получены навыки работы с указателями и побитовыми операциями в языке C
Таким образом, цель работы полностью достигнута.
---
ПРИЛОЖЕНИЕ А (обязательное)
Листинг программы
```c
#include <stdio.h>
/**
* Выводит битовое представление области памяти
*
* @param data - указатель на начало области памяти
* @param size - размер области памяти в байтах
*/
void print_bits_simple(void *data, int size) {
unsigned char *p = (unsigned char*)data;
// Проходим по байтам от старшего к младшему
for (int i = size - 1; i >= 0; i--) {
// Проходим по битам внутри байта от 7 к 0
for (int j = 7; j >= 0; j--) {
// Извлекаем j-й бит с помощью сдвига и маски
printf("%d", (p[i] >> j) & 1);
}
// Разделяем байты пробелом для наглядности
printf(" ");
}
printf("\n");
}
int main() {
// ---- ЦЕЛЫЕ ЧИСЛА (1 БАЙТ) ----
char signed_char = -5;
unsigned char unsigned_char = 5;
// ---- ЦЕЛЫЕ ЧИСЛА (2 БАЙТА) ----
short int signed_short = -32768;
unsigned short int unsigned_short = 32768;
// ---- ЦЕЛЫЕ ЧИСЛА (4 БАЙТА) ----
int signed_int = -10;
unsigned int unsigned_int = 10;
// ---- ВЕЩЕСТВЕННЫЕ ЧИСЛА (4 БАЙТА) ----
float float_num = 0.5f;
float float_negative = -1.0f;
// ---- ВЕЩЕСТВЕННЫЕ ЧИСЛА (8 БАЙТ) ----
double double_num = 0.5;
// ---- ВЫВОД РЕЗУЛЬТАТОВ ----
printf("=== ЦЕЛЫЕ ЧИСЛА ===\n\n");
printf("1 байт (char):\n");
printf(" signed char (-5): ");
print_bits_simple(&signed_char, sizeof(signed_char));
printf(" unsigned char (5): ");
print_bits_simple(&unsigned_char, sizeof(unsigned_char));
printf("\n2 байта (short):\n");
printf(" signed short (-32768): ");
print_bits_simple(&signed_short, sizeof(signed_short));
printf(" unsigned short (32768):");
print_bits_simple(&unsigned_short, sizeof(unsigned_short));
printf("\n4 байта (int):\n");
printf(" signed int (-10): ");
print_bits_simple(&signed_int, sizeof(signed_int));
printf(" unsigned int (10): ");
print_bits_simple(&unsigned_int, sizeof(unsigned_int));
printf("\n=== ВЕЩЕСТВЕННЫЕ ЧИСЛА ===\n\n");
printf("4 байта (float):\n");
printf(" float (0.5): ");
print_bits_simple(&float_num, sizeof(float_num));
printf(" float (-1.0): ");
print_bits_simple(&float_negative, sizeof(float_negative));
printf("\n8 байт (double):\n");
printf(" double (0.5): ");
print_bits_simple(&double_num, sizeof(double_num));
return 0;
}
```