Цель работы.
Представление целых чисел в компьютере
Теория.Двоичное представление чисел.
Целочисленное множество в компьютере сильно отличается от целочисленного множества в математике. Целочисленное множество в компьютере имеет границы в связи с его кодировкой в двоичной системе и ограниченным кол-вом мест для кодировки символа, такимобразомколичество элементов в целочисленном множестве определенно заранее. Из этого можно догадаться что и операция сложения работает иначе и образуется так называемая зацыкленость чисел. В математике всегда при прибавлении к числу 1, получается число, большее предыдущего на 1.При работе с компьютером эта оператор всегда работает так же, как и в математике, за исключением одного случая, когда число доходит до максимального числа в заданных границах целочисленного множества. Тогда при прибавлении к этому числу 1, оно даст не следующее, большее число, а число, которое меньше предыдущего и которое является нижней границей в этом множестве.Это мы и попробуем определить в ходе лабораторной работы.Мы убедимся в этом, проделав определенные действия в программе.
Integer - целочисленным типом данных в компьютере.У этого типа, как и у других, существует ограничение.Границы варьируются и зависят от памяти, которую в компьютере занимает тип integer. integer может занимать от 2 до 4 байт. Чтобы зафиксировать эти границы значения существуют подвиды longinteger и shortinteger. также сказать, что целые типы int, long и short еще подразделяются на беззнаковые (unsigned) и знаковые (signed).
В компьютере число записывается в память в виде двоичного кода. В знаковом типе, знак числа записывается в старшем разряде числа (в крайней левой ячейке). В языке C для отрицательных чисел в старшем разряде записывается 1, а для положительных – 0. При написании слова unsigned, число не изменяется, но разряд, отвечающий за знак, просто начинает обозначать еще один разряд числа. В итоге как бы мало ни было отрицательное число, при переводе его в беззнаковый тип, оно станет большим. Эту тонкость нужно иметь в виду при выполнении лабораторной работы с беззнаковым типом. Так же стоит упомянуть, что 0 в любом типе в двоичном виде представляется как 000…0.
Как было сказано выше, в беззнаковом типе двоичный код числа – есть само число, так как разряд, отвечающий за знак, присваивается числу и становится с ним одним целым. Значит, минимальное число будет состоять из всех 0, а максимальное из всех 1. Используя это можно предположить, что если к максимальному числу прибавить 1, то числа, которое будет больше этого, не получится, а получится как раз минимальное. Дело в том, что когда память полностью заполнена всеми 1, а мы добавляем еще 1, то следующее число должно быть 100..0. Но так как память заполнена, единице в новом числе в максимальном разряде негде сохраниться, и она просто исчезнет, останутся одни нули, что по нашему предположению равно 0.
Написание Программы на С.
#include<stdio.h>
int main()
{
unsignedinti;
i=0;
i=i-1;
if (i+1<i)
printf(“максимальное %u\n”,i);
i=0;
if (i-1>i)
printf(“минимальное %u\n”,i);
return 0;
}
В начале программы мы задаем переменной значение 0. По предположению, если мы вычтем 1, мы получим число больше 0. Ставим условие, проверяем, если это действительно так, выводим это самое максимальное число (0-1).На выходе получим число близкое к максимальному так как при вычетание единицы из 000..000 мы взаимствуем единицу из не существущей ячейки и получаем 111..110
Для знакового типа нужно сначала понять, как вообще записываются числа в память. Как было сказано выше, знак числа записывается в первом разряде, минус=1, плюс=0. Значит самое минимальное число в диапазоне (например, -128), будет записано как 10000000, а самое максимальное (например, 127) будет записано как 01111111. Значит, если расставить все числа по порядку от 0 до наибольшего так, как они записаны в двоичном коде, то получится такая последовательность: 0, затем все положительные числа (например, от 1 до 127, но в двоичной от 00000001 до 01111111), затем все отрицательные числа (но в обратном порядке в десятичной записи, то есть будет от -128 до -1, в двоичной от 10000000 до 11111111). Используя это предположение, можно придумать довольно хитрый алгоритм. Отрицательных чисел на одно больше, чем положительных. Значит, при делении максимального числа в беззнаковом пополам, получится максимальное в знаковом (например, 255/2=127). А прибавив 1, получится минимальное в знаковом. (127+1=128=10000000=-128 в знаковом).