Как найти диапазон значений целых чисел



Задание 1. Как в памяти компьютера представляются целые положительные и отрицательные числа?

Числа в памяти компьютера хранятся в ячейках, а минимальный размер одной ячейки – 8 битов (1 байт). Числа в двоичной системе счисления и записываются к правому краю и оставшиеся слева записываем нулями (чем левее разряд, тем он старше). Знак числа хранит самый старший разряд (первый по списку слева). Если стоит 0 – число положительное, если 1 – число отрицательное.
Самое большое целое положительное число 011111112 = 12710


Задание 2. Укажите, каков был бы диапазон значений целых чисел, если бы для их хранения использовалась четырехразрядная ячейка.

-(24) ≤ X ≤ 24-1
-16 ≤ X ≤ 15


Задание 3. Запишите внутреннее представление следующих десятичных чисел, используя восьмиразрядную ячейку: а) 32; б) –32; в) 102; г) –102; д) 126; е) –126.

а) 32 число положительное
3210 = 1000002
Ответ: 00100000

б) –32 число отрицательное
1) 3210 = 001000002
2) Обратный код: 11011111
3) Прибавим единицу: 11011111 + 1 = 11100000
Ответ: 11100000

в) 102 число положительное
10210 = 11001102
Ответ: 01100110

г) –102 число отрицательное
1) 10210 = 011001102
2) Обратный код: 10011001
3) Прибавим единицу: 10011001 + 1 = 10011010
Ответ: 10011010

д) 126 число положительное
12610 = 11111102
Ответ: 01111110

е) –126 число отрицательное
1) 12610 = 011111102
2) Обратный код: 10000001
3) Прибавим единицу: 10000001 + 1 = 10000010
Ответ: 10000010


Задание 4. Определите, каким десятичным числам соответствуют следующие двоичные коды восьмиразрядного представления целых чисел: а) 00010101; б) 11111110; в) 00111111; г) 10101010.

а) 00010101 число положительное
101012 = 1*24 + 1*22 + 1 = 16 + 4 + 1 = 2110
Ответ: 21

б) 11111110 число отрицательное
1) Вычтем единицу: 11111110 – 1 = 11111101
2) Обратный код: 00000010
3) 102 = 210
Ответ: –2

в) 00111111 число положительное
1111112 = 1*25 + 1*24 + 1*23 + 1*22 + 1*21 + 1 = 32 + 16 + 8 + 4 + 2 + 1 = 6310
Ответ: 61

г) 10101010 число отрицательное
1) Вычтем единицу: 10101010 – 1 = 10101001
2) Обратный код: 01010110
3) 10101102 = 1*26 + 1*24 + 1*22 + 2 = 64 + 16 + 4 + 2 = 8610
Ответ: –86

Целые числа без знака

Обычно занимают
в памяти компьютера один или два байта.
В однобайтовом формате принимают
значения от 000000002до 111111112.
В двубайтовом формате – от 00000000 000000002до 11111111 111111112.

Диапазоны значений целых чисел без знака

Формат числа
в байтах

Диапазон

Запись с
порядком

Обычная
запись

1

0 … 28-1

0 … 255

2

0 … 216-1

0 … 65535

Примеры:

а) число 7210= 10010002воднобайтовомформате:

б) это же число
в двубайтовомформате:

в) число 65535 в
двубайтовомформате:

Целые числа со знаком

Обычно занимают
в памяти компьютера один, два или четыре
байта, при этом самый левый (старший)
разряд содержит информацию о знаке
числа.

Диапазоны
значений целых чисел со знаком

Формат
числа в байтах

Диапазон

Запись с
порядком

Обычная
запись

1

-27… 27-1

-128 … 127

2

-215… 215-1

-32768 … 32767

4

-231… 231-1

-2147483648 …
2147483647

Рассмотрим
особенности записи целых чисел со знаком
на примере однобайтового формата,
при котором для знака отводится один
разряд, а для цифр абсолютной величины
– семь разрядов.

В компьютерной
технике применяются три формы записи
(кодирования) целых чисел со знаком:

прямойкод,обратныйкод,дополнительныйкод.

Последние
две формы применяются особенно широко,
так как позволяют упростить конструкцию
арифметико-логического устройства
компьютера путем замены разнообразных
арифметических операций операцией
cложения.

Положительные
числа
в прямом, обратном и
дополнительном кодах изображаются
одинаково – двоичными кодами с цифрой
0 в знаковом разряде. Например:

Отрицательные
числа
в прямом, обратном и
дополнительном кодах имеют разное
изображение.

1. Прямой
код
. В знаковый разряд помещается
цифра 1, а в разряды цифровой части числа
— двоичный код его АБСОЛЮТНОЙ величины.
Например:

2. Обратный
код
. Получается инвертированием всех
цифр двоичного кода АБСОЛЮТНОЙ величины
числа, включая разряд знака: нули
заменяются единицами, а единицы —
нулями. Например:

3. Дополнительный
код
. Получается образованием обратного
кода с последующим прибавлением единицы
к его младшему разряду. Например:

Обычно
отрицательные десятичные числа при
вводе в машину автоматически преобразуются
в обратный или дополнительный двоичный
код
и в таком виде хранятся, перемещаются
и участвуют в операциях. При выводе
таких чисел из машины происходитобратное
преобразование в отрицательные десятичные
числа.

31. ПРЕДСТАВЛЕНИЕ
В КОМПЬЮТЕРЕ ВЕЩЕСТВЕННЫЕ ЧИСЛА

Система вещественных чисел в
математических вычислениях предполагается
непрерывной и бесконечной,
т.е. не
имеющей ограничений на диапазон и
точность представления чисел. Однако
в компьютерах числа хранятся в регистрах
и ячейках памяти с ограниченным
количеством разрядов. В следствие этогосистема вещественных чисел, представимых
в машине, является дискретной (прерывной)
и конечной.

При написании
вещественных чисел в программах вместо
привычной запятой принято ставить
точку. Для отображения вещественных
чисел, которые могут быть как очень
маленькими, так и очень большими,
используется форма записи чисел с
порядком основания системы счисления.
Например, десятичное число 1.25 в этой
форме можно представить так:

1.25 .100= 0.125.101= 0.0125.102= …
или так:

12.5 .10-1= 125.0.10-2= 1250.0.10-3= … .

Любое число
Nв системе счисления с основаниемqможно записать в видеN = M .
q
p, гдеM— множитель,
содержащий все цифры числа(мантисса),
аp— целое число, называемоепорядком. Такой способ записи
чисел называетсяпредставлением
числа с плавающей точкой
.

Если “плавающая”
точка расположена в мантиссе перед
первой значащей цифрой, то при фиксированном
количестве разрядов, отведённых под
мантиссу, обеспечивается запись
максимального количества значащих цифр
числа, то есть максимальная точность
представления числа в машине. Из этого
следует:

Мантисса
должна быть правильной дробью, у
которой первая цифра после точки
(запятой в обычной записи) отлична от
нуля: 0.1
2 <= |M|
< 1. Если это требование выполнено,
то число называется нормализованным

Мантиссу и
порядок q-ичного числа принято
записывать в системе с основаниемq,
а само основание — в десятичной системе.
Примеры нормализованного представления:

Десятичная система Двоичная система

753.15 = 0.75315.103; —101.01 =
—0.10101.211(порядок 112= 310)
— 0.000034 = — 0.34.10-4; 0.000011 = 0.11.2-100(порядок —1002= —410).

Вещественные
числа в компьютерах различных типов
записываются по-разному, тем не менее,
все компьютеры поддерживают несколько
международных стандартных форматов,
различающихся по точности, но имеющих
одинаковую структуру следующего вида:

Здесь порядок
n-разрядного нормализованного числа
задается в так называемойсмещенной
форме
: если для задания порядка
выделеноkразрядов, то к истинному
значению порядка,представленного в
дополнительном коде
, прибавляют
смещение, равное (2k-1— 1). Например,
порядок, принимающий значения в диапазоне
от —128 до +127, представляется смещенным
порядком, значения которого меняются
от 0 до 255.

Использование
смещенной формы позволяет производить
операции над порядками, как над
беззнаковыми числами, что упрощает
операции сравнения, сложения и вычитания
порядков, а также упрощает операцию
сравнения самих нормализованных чисел.

Чем больше разрядов
отводится под запись мантиссы, тем выше
точность представления числа. Чем больше
разрядов занимает порядок, тем шире
диапазон от наименьшего отличного от
нуля числа до наибольшего числа,
представимого в машине при заданном
формате.

Стандартные
форматы представления вещественных
чисел:

1) одинарный— 32-разрядное нормализованное число
со знаком, 8-разрядным смещенным
порядком и 24-разрядной мантиссой
(старший бит мантиссы, всегда равный
1, не хранится в памяти, и размер поля,
выделенного для хранения мантиссы,
составляет только 23 разряда).

2) двойной— 64-разрядное нормализованное число
со знаком, 11-разрядным смещенным
порядком и 53-разрядной мантиссой
(старший бит мантиссы не хранится,
размер поля, выделенного для хранения
мантиссы, составляет 52 разряда).

3) расширенный— 80-разрядное число со знаком,
15-разрядным смещенным порядком и
64-разрядной мантиссой. Позволяет
хранить ненормализованные числа.

Следует
отметить, что вещественный формат с
m-разрядной мантиссой позволяет
абсолютно точно представлятьm-разрядные
целые числа, т. е.любое двоичное целое
число, содержащее не более
m
разрядов, может быть без искажений
преобразовано в вещественный формат.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

Как пользоваться калькулятором дальности

Шаг 1

Введите свой набор чисел в поле ввода. Цифры следует разделять запятыми.

Шаг 2

Нажмите Enter на клавиатуре или на стрелку справа от поля ввода.

Шаг 3

Во всплывающем окне выберите Найти диапазон. Вы также можете воспользоваться поиском.

Калькулятор диапазона

Что такое диапазон в математике

Диапазон – это математическая величина, которая широко используется при анализе статистических данных.
Люди часто путают диапазон, режим и средние значения. Однако все эти расчеты
используются для разных целей, хотя у них есть нечто общее.


Как рассчитывается диапазон. Диапазон набора чисел – это значение, которое при размещении
набор в порядке возрастания будет ровно посередине строки. Если сумма
чисел четное, то посередине будет два числа. В такой ситуации результат
будет средним арифметическим этих двух чисел.

Числовой диапазон (range) — упорядоченная последовательность целых чисел с заданным шагом.

Синтаксис функции range выглядит так:

range([start], stop[, step])

start — число начала последовательности (по умолчанию 0).
stop — число конца последовательности.
step — шаг между каждым числом последовательности.

Параметры start и step — не обязательные, если их не указывать, то последовательность будет создаваться от 0 до stop с шагом 1.

Также следует помнить, что:

  • Все параметры функции range должны быть целыми числами.
  • Параметры могут быть отрицательными числами.
  • Если шаг step отрицательный, нужно помнить, что значение start должно быть больше значения stop.
  • Параметр stop не включается в последовательность.

Для генерации будем использовать различные комбинации:

my_list = list(range(10))
print(my_list)
#[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
my_list = list(range(5, 10))
print(my_list)
#[5, 6, 7, 8, 9]
my_list = list(range(5, 10, 2))
print(my_list)
#[5, 7, 9]
my_list = list(range(0, -10, -1))
print(my_list)
#[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]

Генерация списка в цикле с помощью range

nums = [n for n in range(1, 11)]
print(nums)
#[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Использование числового диапазона range в циклах

Несколько простых примеров:

for i in range(5):
print(i)
#0
#1
#2
#3
#4
for i in range(5, 10):
print(i)
#5
#6
#7
#8
#9
for i in range(2, 10, 2):
print(i)
#2
#4
#6
#8

Функция range для обратного порядка:

for i in range(-2, -10, -2):
print(i)
#-2
#-4
#-6
#-8

Индексация и срезы в range

Индексация range

Тут все стандартно, как и в списках и в кортежах, индексация начинается 0.

Обращение к элементу диапазона:

data = range(1, 10)
print(data[0])
print(data[5])
print(data[-1])
#1
#6
#9

Срезы в range

Синтаксис срезов [I:J:Step].
С I до смещения J, не включая его.

data = range(1, 10)
print(data[1:4])
print(data[:4])
print(data[3:])
#range(2, 5)
#range(1, 5)
#range(4, 10)

Основные операции с числовым диапазоном range

Длина диапазона: len(r)

data = range(10)
print(len(data))
#10

Минимальный элемент диапазона: min(r)

data = range(10)
print(min(data))
#0

Максимальный элемент диапазона: max(r)

data = range(10)
print(max(data))
#9

Индекс числа в диапазоне: range.index(x[, start[, end]])
Необязательные аргументы start и end, указывают на промежуток поиска:

data = range(10)
print(data.index(5))
#5
data = range(2, 10)
print(data.index(5))
#3

Примеры работы range в задачах

Найти сумму чисел от 1 до 10.

Создадим переменную s, в которую будем записывать сумму чисел. И присвоим ей значение 0.
Создадим числовой диапазон от 1 до 11 (т.к. range не включает последнее число в последовательность)
Создадим цикл for в котором будем перебирать в диапазоне цифры от 1 до 10.
Внутри цикла будем записывать в переменную s сумму с каждым числом из диапазона.

s = 0
for i in range(1, 11):
s = s + i
print(s)
#55

Найти сумму четных чисел от 1 до 10.

Делаем, все тоже самое, что и в первой задаче, но в range делаем начало диапазона 0 и шаг 2, таким образом, получаем все четные числа от 0 до 10.

s = 0
for i in range(0, 11, 2):
s = s + i
print(s)
#30

Вывести все буквы строки отдельно.

Создаем цикл длина диапазона, которого равна длине строки.
С помощью индексации выводим каждый элемент строки в цикле.

s = 'abcdef'
for i in range(len(s)):
print(s[i])
#a
#b
#c
#d
#e
#f

Частая ошибка index out of range

Это ошибка возникает довольно часто, если не внимательно относиться к границам диапазона.

Допустим, есть список чисел от 1 до 10, нужно оставить в этом списке только числа, которые делятся на 2.

nums = [n for n in range(1, 11)]   #генерируем список с числами о 1 до 10
for i in range(len(nums)):         #перебераем все числа
if nums[i] % 2 != 0:               #находим числа, которые не делятся на 2
del nums[i]                        #удаляем такие числа
print(nums)
#builtins.IndexError: list assignment index out of range

В итоге вместо результата, получаем ошибку.

Это случилось из-за того, что мы прямо в цикле удалили элемент из списка, тем самым изменив его длину, а это повлияло на диапазон.
Т.е. на старте цикла была одна длина списка с числами, а во время выполнения эта длина изменилась. Python, держа в памяти старую длину, пробует обратиться по индексам к тем элементам, которых уже нет в списке.

Выход довольно прост, чтобы избежать такой ошибки, нельзя изменять список внутри цикла. Вместо этого лучше создавать новый список с нужным результатом.

nums = [n for n in range(1, 11)]   #генерируем список с числами о 1 до 10
fin_nums = []                      #создаем пустой список
for i in range(len(nums)):         #перебираем все числа
if nums[i] % 2 == 0:               #находим числа, которые делятся на 2
fin_nums.append(nums[i])           #добавляем в наш новый список
print(fin_nums)
#[2, 4, 6, 8, 10]

Теперь все гуд.

Урок №31. Целочисленные типы данных: short, int и long

На этом уроке мы рассмотрим целочисленные типы данных в языке С++, их диапазоны значений, операцию деления, а также переполнение (что это такое и примеры).

Целочисленные типы данных

Целочисленный тип данных — это тип, переменные которого могут содержать только целые числа (без дробной части, например: -2, -1, 0, 1, 2). В языке C++ есть 5 основных целочисленных типов, доступных для использования:

Урок №31. Целочисленные типы данных: short, int и long

Примечание : Тип char — это особый случай: он является как целочисленным, так и символьным типом данных. Об этом детально мы поговорим на одном из следующих уроков.

Основным различием между целочисленными типами, перечисленными выше, является их размер , чем он больше, тем больше значений сможет хранить переменная этого типа.

Определение целочисленных переменных

Определение происходит следующим образом:

char c ;

short int si ; // допустимо

short s ; // предпочтительнее

int i ;

long int li ; // допустимо

long l ; // предпочтительнее

long long int lli ; // допустимо

long long ll ; // предпочтительнее

В то время как полные названия short int , long int и long long int могут использоваться, их сокращенные версии (без int ) более предпочтительны для использования. К тому же постоянное добавление int затрудняет чтение кода (легко перепутать с именем переменной).

Диапазоны значений и знак целочисленных типов данных

Как вы уже знаете из предыдущего урока, переменная с n-ным количеством бит может хранить 2n возможных значений. Но что это за значения? Это значения, которые находятся в диапазоне. Диапазон — это значения от и до, которые может хранить определенный тип данных. Диапазон целочисленной переменной определяется двумя факторами: её размером (измеряется в битах) и её знаком (который может быть signed или unsigned ).

Целочисленный тип signed (со знаком) означает, что переменная может содержать как положительные, так и отрицательные числа. Чтобы объявить переменную как signed, используйте ключевое слово signed :

signed char c ;

signed short s ;

signed int i ;

signed long l ;

signed long long ll ;

По умолчанию, ключевое слово signed пишется перед типом данных.

1-байтовая целочисленная переменная со знаком (signed) имеет диапазон значений от -128 до 127, т.е. любое значение от -128 до 127 (включительно) может храниться в ней безопасно.

В некоторых случаях мы можем заранее знать, что отрицательные числа в программе использоваться не будут. Это очень часто встречается при использовании переменных для хранения количества или размера чего-либо (например, ваш рост или вес не может быть отрицательным).

Целочисленный тип unsigned (без знака) может содержать только положительные числа. Чтобы объявить переменную как unsigned , используйте ключевое слово unsigned :

unsigned char c ;

unsigned short s ;

unsigned int i ;

unsigned long l ;

unsigned long long ll ;

1-байтовая целочисленная переменная без знака (unsigned) имеет диапазон значений от 0 до 255.

Обратите внимание, объявление переменной как unsigned означает, что она не сможет содержать отрицательные числа (только положительные).

Теперь, когда вы поняли разницу между signed и unsigned, давайте рассмотрим диапазоны значений разных типов данных:

Урок №31. Целочисленные типы данных: short, int и long

Для математиков: Переменная signed с n-ным количеством бит имеет диапазон от -(2n-1 ) до 2n-1 -1. Переменная unsigned с n-ным количеством бит имеет диапазон от 0 до (2n )-1.

Для нематематиков: Используем таблицу

Начинающие программисты иногда путаются между signed и unsigned переменными. Но есть простой способ запомнить их различия. Чем отличается отрицательное число от положительного? Правильно! Минусом спереди. Если минуса нет, значит число — положительное. Следовательно, целочисленный тип со знаком (signed) означает, что минус может присутствовать, т.е. числа могут быть как положительными, так и отрицательными. Целочисленный тип без знака (unsigned) означает, что минус спереди отсутствует, т.е. числа могут быть только положительными.

Что используется по умолчанию: signed или unsigned?

Так что же произойдет, если мы объявим переменную без указания signed или unsigned?

Урок №31. Целочисленные типы данных: short, int и long

Все целочисленные типы данных, кроме char, являются signed по умолчанию. Тип char может быть как signed, так и unsigned (но, обычно, signed).

В большинстве случаев ключевое слово signed не пишется (оно и так используется по умолчанию).

Программисты, как правило, избегают использования целочисленных типов unsigned, если в этом нет особой надобности, так как с переменными unsigned ошибок, по статистике, возникает больше, нежели с переменными signed.

Правило: Используйте целочисленные типы signed, вместо unsigned .

Переполнение

Вопрос: «Что произойдет, если мы попытаемся использовать значение, которое находится вне диапазона значений определенного типа данных?». Ответ: «Переполнение».

Переполнение (англ. «overflow» ) случается при потере бит из-за того, что переменной не было выделено достаточно памяти для их хранения.

На уроке №28 мы говорили о том, что данные хранятся в бинарном (двоичном) формате и каждый бит может иметь только 2 возможных значения (0 или 1 ). Вот как выглядит диапазон чисел от 0 до 15 в десятичной и двоичной системах:

Урок №31. Целочисленные типы данных: short, int и long

Как вы можете видеть, чем больше число, тем больше ему требуется бит. Поскольку наши переменные имеют фиксированный размер, то на них накладываются ограничения на количество данных, которые они могут хранить.

Примеры переполнения

Рассмотрим переменную unsigned, которая состоит из 4-х бит. Любое из двоичных чисел, перечисленных в таблице выше, поместится внутри этой переменной.

«Но что произойдет, если мы попытаемся присвоить значение, которое занимает больше 4-х бит?». Правильно! Переполнение. Наша переменная будет хранить только 4 наименее значимых (те, что справа) бита, все остальные — потеряются.

Например, если мы попытаемся поместить число 21 в нашу 4-битную переменную:

Урок №31. Целочисленные типы данных: short, int и long

Число 21 занимает 5 бит (10101). 4 бита справа (0101) поместятся в переменную, а крайний левый бит (1) просто потеряется. Т.е. наша переменная будет содержать 0101, что равно 101 (нуль спереди не считается), а это уже число 5, а не 21.

Примечание : О конвертации чисел из двоичной системы в десятичную и наоборот будет отдельный урок, где мы всё детально рассмотрим и обсудим.

Теперь рассмотрим пример в коде (тип short занимает 16 бит):

#include <iostream>

int main ( )

{

unsigned short x = 65535 ; // наибольшее значение, которое может хранить 16-битная unsigned переменная

std :: cout << “x was: ” << x << std :: endl ;

x = x + 1 ; // 65536 – это число больше максимально допустимого числа из диапазона допустимых значений. Следовательно, произойдет переполнение, так как переменнная x не может хранить 17 бит

std :: cout << “x is now: ” << x << std :: endl ;

return 0 ;

}

Результат выполнения программы:

x was: 65535
x is now: 0

Что случилось? Произошло переполнение, так как мы попытались присвоить переменной x значение больше, чем она способна в себе хранить.

Для тех, кто хочет знать больше: Число 65 535 в двоичной системе счисления представлено как 1111 1111 1111 1111. 65 535 — это наибольшее число, которое может хранить 2-байтовая (16 бит) целочисленная переменная без знака, так как это число использует все 16 бит. Когда мы добавляем 1, то получаем число 65 536. Число 65 536 представлено в двоичной системе как 1 0000 0000 0000 0000, и занимает 17 бит! Следовательно, самый главный бит (которым является 1) теряется, а все 16 бит справа — остаются. Комбинация 0000 0000 0000 0000 соответствует десятичному 0, что и является нашим результатом.

Аналогичным образом, мы получим переполнение, использовав число меньше минимального из диапазона допустимых значений:

#include <iostream>

int main ( )

{

unsigned short x = 0 ; // наименьшее значение, которое 2-байтовая unsigned переменная может хранить

std :: cout << “x was: ” << x << std :: endl ;

x = x – 1 ; // переполнение!

std :: cout << “x is now: ” << x << std :: endl ;

return 0 ;

}

Результат выполнения программы:

x was: 0
x is now: 65535

Переполнение приводит к потере информации, а это никогда не приветствуется. Если есть хоть малейшее подозрение или предположение, что значением переменной может быть число, которое находится вне диапазона допустимых значений используемого типа данных — используйте тип данных побольше!

Правило: Никогда не допускайте возникновения переполнения в ваших программах!

Деление целочисленных переменных

В языке C++ при делении двух целых чисел, где результатом является другое целое число, всё довольно предсказуемо:

#include <iostream>

int main ( )

{

std :: cout << 20 / 4 << std :: endl ;

return 0 ;

}

Результат:

5

Но что произойдет, если в результате деления двух целых чисел мы получим дробное число? Например:

#include <iostream>

int main ( )

{

std :: cout << 8 / 5 << std :: endl ;

return 0 ;

}

Результат:

1

В языке C++ при делении целых чисел результатом всегда будет другое целое число. А такие числа не могут иметь дробь (она просто отбрасывается, не округляется! ).

Рассмотрим детально вышеприведенный пример: 8 / 5 = 1.6 . Но как мы уже знаем, при делении целых чисел результатом является другое целое число. Таким образом, дробная часть (0.6 ) значения отбрасывается и остается 1 .

Правило: Будьте осторожны при делении целых чисел, так как любая дробная часть всегда отбрасывается.

Добавить комментарий