1. 16-битная арифметика со знаком предполагает, что самый левый бит используется для хранения знака. Отрицательные числа хранятся в дополнительном коде. При этом диапазон представления данных составляет -32768..32767. 32760+9 можно записать как 32767+2. Это позволит избежать перевода 32760 в двоичную систему счисления, а 32767 - это 15 двоичных единиц. В знаковом разряде, конечно же, ноль. После сложения в знаковом разряде появляется единица, что означает наличие отрицательного числа в дополнительном коде. Знаковый разряд мы не трогаем, а остальные инвертируем и арифметически прибавляем к полученному числу единицу. Тем самым переходим к прямому коду, который переводим в десятичную систему представления. И результат, конечно, же, будет со знаком минус, т.е. -32767. Вот к чему приводит переполнение разрядной сетки в целочисленной арифметике. Кстати, аппаратно оно не обнаруживается, поскольку криминала нет - просто +1 переходит в самый старший (левый) разряд. "Железо" ведь не знает, сколько разрядов мы отвели под представление чисел и как биты нужно рассматривать! Соответствующая картинка находится в первом вложении.
2. В восьмибитной арифметике все происходит аналогично. 127 представляется знаковым нулем и семью единицами в остальных разрядах, т.е. 01111111₂. Тройка - это 0..011₂ Складываем и получаем 10000010₂. Опять знаковый разряд единичный, инвертируем остальные: 11111101. А теперь прибавляем единицу и получаем 11111110₂. Числу 1111110₂ (знаковый разряд мы не учитываем) соответствует 126₁₀, а с учетом знака окончательно получаем -126.
3. Тут немного больше нужно повозиться. Арифметика снова 16-битная, диапазон представления чисел -32768..32767. Выпишем факториалы в пределах этого диапазона и одно значение вне его. 1!=1, 2!=2, 3!=6, 4!=24, 5"=120, 6!=720, 7!=5040, 8!=40320. Делаем вывод, что максимальное значение факториала можно вычислить для n=7 и n!=5040. Тогда n+1=8 и при его вычислении у нас возникнет арифметическое переполнение. Переведем число 5040 в двоичную систему и умножим его на 8, поскольку 8! = 7! × 8. Поскольку 8 = 2³, то умножение на 8 в двоичной системе равносильно сдвигу числа влево на три разряда. Подробности приведены на рисунке во втором вложении. Мы получим "странный" результат: 8! = -25216.
Конечно, я могу помочь! Вот программа на языке Кумир, которая подсчитывает количество претендентов, чей рост составляет не менее 170 см:
```
{ Объявляем переменную для хранения количества претендентов }
var count: integer;
{ Получаем количество учеников }
write("Введите количество учеников: ");
var n: integer := readinteger;
{ Инициализируем счетчик }
count := 0;
{ Проверяем рост каждого ученика }
for var i: integer := 1 to n do
begin
write("Введите рост ученика ", i, ": ");
var height: integer := readinteger;
{ Проверяем, соответствует ли рост требованиям }
if height >= 170 then
count := count + 1;
end;
{ Выводим результат }
writeln("Количество претендентов, имеющих шанс попасть в команду: ", count);
```
Объяснение программы:
1. Сначала мы объявляем переменную `count`, которая будет хранить количество претендентов, имеющих шанс попасть в команду.
2. Затем мы запрашиваем количество учеников и сохраняем его в переменную `n`.
3. Инициализируем счетчик `count` значением 0.
4. Далее, с помощью цикла `for`, мы перебираем каждого ученика в диапазоне от 1 до `n`.
5. Внутри цикла мы запрашиваем рост каждого ученика и сохраняем его в переменную `height`.
6. После этого, мы проверяем, соответствует ли рост ученика требованиям (больше или равен 170 см). Если да, то увеличиваем значение `count` на 1.
7. По окончании цикла, выводим результат - количество претендентов, имеющих шанс попасть в команду.
Эта программа позволяет школьнику понять логику подсчета и дает возможность самому ввести данные (количество учеников и их рост). Результат будет показывать количество учеников, которые имеют шанс попасть в баскетбольную команду.
0,0(0 оценок)
Полный доступ
Позволит учиться лучше и быстрее. Неограниченный доступ к базе и ответам от экспертов и ai-bota
Оформи подписку