Какое максимальное десятичное число может храниться в 1 байте памяти

Обновлено: 03.07.2024

Чтобы отправлять данные туда и обратно через The Things Network, вам понадобятся байты. Это руководство поможет вам кодировать различные типы данных, используя как можно меньше байтов.

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

Байт — это группа из 8 битов. Бит является самой основной единицей и может быть либо 1, либо 0. Байт - это не просто 8 значений от 0 до 1, а 256 (2 8 ) различных комбинаций (точнее, перестановок) в диапазоне от 00000000 через, например, от 01010101 до 11111111 . Таким образом, один байт может представлять десятичное число от 0 (00) до 255.

Озадачены? Помните, что 3 десятичных числа также обозначают не только 3 значения от 0 до 9, но и 1000 (10 3 ) перестановок от 0 (00) до 999.

Думайте о буфере просто как о другом слове для обозначения массива, списка или любого другого слова, связанного с вашим опытом программирования. Как байт — это группа из 8 битов, так и буфер — это группа из заранее определенного количества байтов. Если у нас есть группа из 3 байтов, она может представлять либо 3 значения от 0 до 255, либо одно значение от 0 до 16777216 (256 3 ).

Часто вы увидите группу байтов, отображаемую как:

Разве байт не представляет собой группу из 8 0 и 1? 🤔 Вы совершенно правы, но так же, как мы уже видели, что 11111111 переводится в старую добрую десятичную систему как 255, мы также можем перевести это в FF в шестнадцатеричной системе, где каждая позиция имеет 16 (0-9 A-F) возможных значений. Преимущество заключается в том, что он короче и указывает максимальное значение (257 – не вариант).

Приведенный выше пример, переведенный в десятичную систему и дополненный для удобочитаемости, будет таким:

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

Код Байтовое значение Десятичное значение Шестнадцатеричное значение
11 00001011 11 B
0x11 00010001 17 11
B11 00000011 3 3

Пример для Arduino:

Да, я знаю… 0x как бы сводит на нет преимущество шестнадцатеричной записи в более коротком формате. 🙃

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

Лучше задать вопрос, как отправлять диапазоны больше 255.

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

Например, представьте, что мы ожидаем значения от 3400 до 3600.

На устройстве мы закодировали бы это как:

А в функциях полезной нагрузки приложения:

Наоборот, в функции полезной нагрузки кодировщика приложения у нас будет:

И на устройстве расшифруйте это с помощью:

Как вы можете видеть, пока известно минимальное значение и диапазон нашего значения составляет 256 или меньше, мы все еще можем использовать один байт без особых усилий. Убедитесь, что ваше значение не превышает 3655, чтобы предотвратить неприятные ошибки.😅

Что делать, если диапазон больше 256? Следующий вопрос будет, если вам нужно знать точное значение. Если ваш датчик имеет диапазон 400 и погрешность 2, вы не потеряете смысла при округлении значения. И 299, и 300 будут округлены до 150, и это нормально.

На устройстве мы закодировали бы это как:

А в функциях полезной нагрузки приложения:

Вы поймете, что это наоборот.

Слово занимает 2 байта (за исключением Due, Zero и подобных плат, где оно составляет 4 байта), что уже дает вам огромный диапазон 65 536 (256 2 ). Тип данных int — это слово, и Arduino поставляется с highByte() и lowByte() для извлечения левого и правого байта из слова. Это упрощает кодирование и декодирование.

Декодирование (функции полезной нагрузки):

Интересно, о чем это? Это значение Left сдвигает 8 бит первого байта на 8 позиций влево. Смущенный? Подумайте о том, как мы могли бы закодировать число 11 как две единицы и декодировать, сдвинув первую единицу на одну позицию вверх (получив 10) перед добавлением другой. Далее мы поговорим подробнее о смещении битов.

Кодировать (функции полезной нагрузки):

Никогда не видели и не использовали этот способ раньше? Это побитовое И. При таком использовании правая часть выражения будет действовать как маска для обнуления одного байта, чтобы мы могли работать только с другим.

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

Допустим, нам нужно закодировать тип long, который использует 4 байта для диапазона до 4294967296.

Декодирование (функции полезной нагрузки):

Чтобы определить разницу между -100 и 100, вам понадобится подписанный тип данных. Они устанавливают старший (крайний левый) бит в 1, чтобы указать, что это отрицательное число. Это означает, что, например, в слове для фактического числа доступны только 15 из 16 битов, что ограничивает диапазон от 65 536 до 32 768.

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

Если вы не ожидаете отрицательных чисел и вам нужен больший диапазон, явно используйте unsigned int или unsigned long .

До сих пор мы имели дело только с округленными числами. Что делать, если вам нужно больше точности? Ответ очень похож на то, как мы индексировали или округляли большие числа. Просто умножьте и разделите значение при его кодировании и декодировании.

Декодирование (функции полезной нагрузки):

Кодировать (функции полезной нагрузки):

Обратите внимание, что используется 100.00 , а не 100 . Если оба являются целыми числами, Arduino/C/C++ также будет выполнять математические операции, используя целые числа, в результате чего получится 1 вместо 1,22.

Во многих случаях вам нужно отправить несколько значений в одном сообщении. Начните с кодирования каждого отдельного числа в буфер байтов, а затем объедините их в один буфер.

Вы можете задаться вопросом, почему memcpy() принимает payload + sizeOfPayloadA, как они выглядят 🍏 и 🍊. Думайте об этом как об инструкции скопировать в буфер полезной нагрузки, но после перемещения точки, в которую она будет копироваться, с длиной полезных данных, которые мы добавили до сих пор.

Декодирование (функции полезной нагрузки)

Кодировать (функция полезной нагрузки)

Короткий ответ: не надо. Текст использует много байтов. Юникод определяет более 128000 символов, так что на каждый символ потребуется 3 байта! Редко бывают веские причины использовать текст вместо чисел, за исключением, возможно, передачи некоторого пользовательского ввода. В большинстве случаев достаточно только буквенно-цифровых символов, в этом случае вы можете избежать использования символов ASCII, которые используют только один байт на символ. Каждая строка должна заканчиваться символом NULL (0x00, ‘\0’), чтобы указать, что строка закончилась.

Вот своего рода глоссарий компьютерных модных словечек, с которыми вы столкнетесь при использовании компьютера:

Бит
Компьютерные процессоры могут только сказать, включен провод или нет. К счастью, они могут просматривать множество проводов одновременно (см. шину) и довольно изощренно реагировать на сложную последовательность включений и отключений. Чтобы преобразовать эти шаблоны во что-то, что имеет смысл для людей, мы рассматриваем подключенный провод как «1», а отключенный провод как «0». Затем мы можем посмотреть на провода, ведущие к компьютеру, и прочитать что-то вроде 00110111 00010000. Мы не знаем, что это представляет для процессора, это просто шаблон. Каждое место в шаблоне — это бит, который может быть равен 1 или 0. Если это означает число для процессора, биты составляют двоичное число.

Двоичные числа
В наши дни большинство из нас считает десятками. В древних культурах считали 5, 12 или 24, но за последнюю тысячу лет счет десятками стал нормой. когда вы видите число 145, вы просто знаете, что оно включает в себя одну группу из десяти десятков, плюс четыре группы из десяти и еще пять. Десять десятков это сто или десять в квадрате. Десять сотен — это тысяча, или десять в третьей. Здесь есть закономерность. Каждая цифра представляет собой количество десятков, возведенное в степень положения цифры, при условии, что вы начинаете счет с нуля и считаете справа налево.

Если вы проделаете то же самое с битами, которые могут быть только 1 или 0, каждая позиция в списке битов представляет некоторую степень двойки. 1001 означает одна восьмерка плюс ни одной четверки плюс ни одной двойки плюс еще одна. Это называется двоичной записью. Вы можете преобразовывать числа из двоичной записи в десятичную, но это требуется редко.

Байты
Числа вроде 00110111 10110000 намного легче читать, если вы ставите пробелы через каждые 8 ​​бит. В десятичном представлении мы используем запятые через каждые три цифры по той же причине. В 8 битах нет ничего особенного, просто так все началось. Фурнитура проще собрать, если вы сгруппируете провода последовательно от одной части к другой. Некоторое старое оборудование группировало провода по 10, но в 70-х идея работы группами по 8 действительно преобладала, особенно при разработке интегральных схем. Кто-то пошутил о группе, переносящей байт данных, и термин прижился. Иногда можно услышать группу из четырех битов, называемую полубайтом.

Самое большое число, которое можно представить с помощью 8 бит, — 1 111 1111, или 255 в десятичной системе счисления. Поскольку 00000000 является наименьшим, вы можете представить 256 элементов с помощью байта. (Помните, укус — это всего лишь шаблон.Он может представлять собой букву или оттенок зеленого.) Биты в байте имеют числа. Крайний правый бит — это бит 0, а левый — бит 7. Эти два бита также имеют имена. Самый правый - это младший значащий бит или младший бит. Он наименее значим, потому что его изменение оказывает наименьшее влияние на значение. Какой мсб? (Байты в больших числах также можно назвать наименее значимыми и наиболее значимыми.)

Шестнадцатеричные числа
Даже с пробелом 00110111 10110000 довольно сложно прочитать. Разработчики программного обеспечения часто используют код, называемый шестнадцатеричным, для представления двоичных шаблонов. Шестнадцатеричная система была создана путем преобразования десятичной системы счисления в двоичную и наоборот. Кто-то добавил шесть цифр к обычным числам от 0 до 9, чтобы число до 15 можно было представить одним символом. Поскольку их нужно было набирать на обычной клавиатуре, использовались буквы A-F. Один из них может представлять собой четыре бита, поэтому байт записывается в виде двух шестнадцатеричных цифр. 00110111 10110000 становится 37B0.

Вот удобная таблица:
Шестнадцатеричный двоичный десятичный
0 0000 0
1 0001 1
2 0010 2
3 0011 3
4 0100 4
5 0101 5
6 0110 6
7 0111 7
8 1000 8
9 1001 9
А 1010 10
Б 1011 11 < br />C 1100 12
D 1101 13
E 1110 14
F 1111 15

При использовании трех разных схем легко спутать числа. 1000 можно перевести как тысяча, восемь или четыре тысячи девяносто шесть. Вы должны указать, какую систему вы используете. Тот факт, что вы все еще иногда видите устаревшую систему, называемую восьмеричной (цифры 0-7. Вы можете это понять), увеличивает вероятность путаницы. Шестнадцатеричные числа можно указать, написав их 1000hex 1000h или 0x1000. Двоичные числа можно записать 1000bin. Восьмеричные числа были просто записаны с дополнительным ведущим 0. Десятичные числа не указываются, за исключением случаев, когда есть вероятность путаницы, например, один на странице шестнадцатеричных чисел.

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

В компьютерной инженерии понятие шины было расширено до обозначения группы проводов, по которым передаются данные по системе. Обычно проводов достаточно для обработки от одного до четырех байтов. Размер этих шин оказывает большое влияние на эффективность системы. 32-битная шина может обрабатывать числа в два раза длиннее (то есть от 2 до 16 больше), чем 16-битная шина.

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

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

Каждый член группы подключен к одному проводу шины данных. Группа может быть проинструктирована некоторыми другими проводами скопировать состояние шины или подключить свои выходы к шине, чтобы шина отражала то, что находится в этой группе. Эти другие провода на самом деле являются второй шиной, называемой адресной шиной. Управляя адресной шиной, центральный процессор может выбирать, какую конкретную группу транзисторов (или ячейку памяти) считывать или модифицировать. Количество проводов в адресной шине определяет, сколько ячеек памяти она может адресовать.

Такой тип памяти называется оперативной памятью для оперативной памяти. Поскольку транзисторы должны оставаться включенными, все данные удаляются при отключении питания. Некоторые компьютеры могут сохранить память, никогда не выключаясь. У них есть батарея, обеспечивающая достаточно энергии для транзисторов памяти, о которых они не забывают.

Еще один тип памяти называется ПЗУ и предназначен для чтения только для чтения. Существуют различные типы этого, но наиболее распространенным является набор предохранителей. Все, что сгорело, представляет собой 0. Ничто не может изменить то, что находится в постоянной памяти, поэтому любая программа или данные в ней доступны, как только компьютер включен.

Диски
Поскольку память очищается при отключении питания, должна быть какая-то механическая система для хранения данных между заданиями. Носитель, используемый для хранения данных, может варьироваться от магнитной ленты до оптических дисков, а некоторые устройства позволяют легко извлекать и заменять носитель. В большинстве этих систем хранения данных используются какие-либо вращающиеся диски.Существует сложная схема отслеживания данных на диске: байты сгруппированы в блоки, блоки в файлы, файлы в каталоги (или папки), а каталоги в разделы (или тома). Пользователь вообще видит только файлы и выше.
Центральный процессор
Центральный процессор или центральный процессор — это сердце компьютера. ЦП считывает инструкцию из памяти (инструкции представляют собой битовые комбинации, как и все остальное), выполняет ее и ищет следующую инструкцию. Инструкции — это простые вещи, такие как копирование значения из памяти. ЦП имеет свои собственные ячейки памяти, называемые регистрами. Специальное оборудование позволяет складывать или вычитать регистры друг из друга. Чтобы сложить два числа, ЦП должен выбрать первое число и поместить его в регистр, выбрать другое число и поместить его в другой регистр, сложить два регистра и поместить результат обратно в память. Каждая из этих операций требует инструкции.
Часы
К счастью, ЦП может делать все это очень быстро. Вся операция управляется схемой генератора, называемой системными часами, которая работает с частотой в миллионы герц (циклов в секунду). Было бы просто думать, что один тактовый цикл означает одну инструкцию, но инструкции различаются по сложности и занимают от 4 до 20 циклов. Операции еще больше замедляются из-за памяти, которая не справляется. Некоторые ЦП имеют сверхскоростную память, называемую кешем, в которой числа, которые необходимы часто, могут храниться и извлекаться быстрее.

Периферийные устройства
ЦП взаимодействует с памятью через адресную шину и шину данных. Для связи с остальным миром используются другие автобусы. (Места, к которым могут подключаться внешние устройства, иногда называют портами.) Эти шины могут быть общими или подсоединены к одному устройству. Они могут быть последовательными или многопроводными, называемыми параллельными. Устройства, подключенные к системе, называются периферийными устройствами; сюда входят клавиатуры, мониторы, мыши, графические планшеты, принтеры, MIDI-системы и многое другое. Каждый из них имеет свои собственные данные и электрические характеристики, но соединение в порту должно быть достаточно стандартизировано, чтобы обеспечить взаимозаменяемость подобных устройств. Ниже приведены виды соединений, используемые в различных системах.

Параллельный порт
Это старый стандарт, изначально разработанный для принтеров, поэтому его часто называют портом принтера, хотя сюда можно подключать другие вещи и принтеры можно подключать другими способами. Что касается портов данных, этот довольно медленный.
IDE/ATA
Это параллельная шина, предназначенная для устройств хранения больших объемов данных. Обычно он спрятан внутри коробки, так как используемые разъемы не очень прочные. В шине IDE есть провода, которые выбирают, какое устройство активно, поэтому логическое расположение устройства (диск A, B и т. д.) зависит от того, к какому разъему оно подключено.

SCSI
Это еще один тип параллельной шины для хранения больших объемов данных. Механически он намного прочнее, чем IDE, поэтому его часто используют между коробками. SCSI — это развивающийся стандарт, который периодически адаптируется для работы на более высоких скоростях. SCSI поддерживает семь устройств на шине, и каждое из них должно иметь уникальный идентификационный номер, установленный на задней панели.

SVGA
Это тип видеоразъема. Это один из многих, но сейчас самый распространенный.

Коммуникационный порт
Это тип последовательного порта, который существует уже несколько десятилетий. Другое его название — RS-232, название технического документа, описывающего, как это должно работать. Это самый медленный порт из всех. Сюда подключаются только очень простые устройства.

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

Ethernet
Существует множество систем, предназначенных для соединения компьютеров друг с другом. Ethernet является одним из самых популярных, потому что его очень быстро и относительно дешево построить. Компьютеры не подключаются напрямую друг к другу с помощью Ethernet — они подключаются через коробку, называемую концентратором или коммутатором, который позволяет нескольким компьютерам общаться по линии вечеринки. Если их всего два, или для подключения компьютера к принтеру через Ethernet можно использовать специальный кабель без концентратора.

USB
USB — это новая высокоскоростная последовательная система. Он рассчитан на 128 устройств и позволяет подключать устройства без отключения питания. (Возможность возиться с IDE или SCSI при включенном питании может привести к повреждению.)

Firewire
Firewire, также известный как IEEE 1394, представляет собой еще более быструю последовательную систему. Он также более надежен, чем USB, по целому ряду причин. Между FireWire и SCSI идет соревнование, кто быстрее. FireWire определенно удобнее.

MIDI
MIDI — это система связи, разработанная для музыкальных инструментов. Он используется для управления другими вещами, но музыка — это главное.MIDI подробно обсуждается в другом месте на этом сайте.

Мне трудно понять типы данных в C. Я просматриваю книгу по C, и одна из задач спрашивает, какое максимальное и минимальное число может хранить короткое число.

Использование sizeof(short); Я вижу, что короткий занимает 2 байта. Это означает, что это 16 бит, что означает два числа, поскольку для хранения двоичного представления числа требуется 8 бит. Например, 9 будет 00111001, что заполняет один бит. Так не будет ли это от 0 до 99 для без знака и от -9 до 9 для знака?

Я знаю, что ошибаюсь, но не знаю почему. Здесь сказано, что максимальное значение составляет (-) 32 767 для подписанных и 65 535 для неподписанных.

короткое целое, 2 байта, 16 бит, диапазон -32 768 -> +32 767 (16 КБ)

16-бит означает, что у вас есть 16 переключателей, которые вы можете включать и выключать. Общее количество различных шаблонов включения-выключения составляет 2^16, что составляет 65 536 различных состояний.

@Antimony см. ссылку в ответе Ричарда Дж. Росса III: Максимальное значение типа short. Минимальное допустимое значение: +32 767

помните, хотя 65536 = 2^16, в соответствии с limit.h максимальное ограничение равно 65535, потому что 65536 считается переполнением

5 ответов 5

На секунду задумайтесь о десятичной системе. Если у вас есть только 2 цифры для номера, это означает, что вы можете хранить в них от 00 до 99. Если у вас есть 4 цифры, этот диапазон становится от 0000 до 9999 .

Двоичное число похоже на десятичное, за исключением того, что цифры могут быть только 0 и 1 вместо 0 , 1 , 2 , 3 , . 9 .

Если у вас есть такой номер:

Для 2-байтового числа этот диапазон становится от 00000000 00000000 до 11111111 11111111, что равно 65535.

Что касается отрицательных чисел, то в компьютере с дополнением до 2 они являются просто соглашением использовать старшую половину диапазона в качестве отрицательных значений. Это означает, что числа, у которых слева стоит 1, считаются отрицательными.

Тем не менее, эти числа конгруэнтны по модулю 256 (по модулю 2^n, если n битов) к их положительному значению, как действительно предполагает число. Например, число 11111111 равно 255, если оно беззнаковое, и -1, если со знаком, что соответствует модулю 256.

Хорошо! Спасибо. Я понял. Я должен думать в числах с основанием 2, а не с основанием 10. Теперь это имеет смысл. Мое понимание было далеко!

@Мохамад, точно. Это довольно похоже на base-10. Всякий раз, когда вы запутались, вы можете использовать эту аналогию, чтобы лучше понять ;)

Ссылка, которую вы прочитали, верна. По крайней мере, для обычных реализаций C, где short составляет 16 бит, это фактически не зафиксировано в стандарте.

16 бит могут содержать 2^16 возможных битовых комбинаций, это 65536 возможностей. Шорты со знаком: от -32768 до 32767, шорты без знака: от 0 до 65535.

Но для хранения числа требуется 8 бит, верно? 16 бит могут хранить 2 числа? Я что-то здесь упускаю!

@Mohamad одного бита достаточно для хранения числа в диапазоне [0;1]. Два бита могут хранить 4 числа. И так далее…

@Mohamad: биты № 8 хранят только числа в диапазоне 0–255. 16 бит хранят числа в диапазоне 0-25535. 32-битные (обычно int) могут хранить где-то 4 миллиарда. Вы поняли идею. Это все степени двойки.

У ОП явно проблемы с пониманием двоичных чисел. Как это поможет ему понять?

Другие опубликовали для вас довольно хорошие решения, но я не думаю, что они последовали вашим размышлениям и объяснили, где вы были неправы. Я попробую.

Я вижу, что шорт занимает 2 байта. Это означает, что это 16 бит,

До этого момента вы были правы (хотя длина short не гарантируется в 2 байта, как и int не гарантируется в 4 — единственным гарантированным размером по стандарту (если я правильно помню) является char, который всегда должен быть 1 байт широкий).

что означает два числа, поскольку для хранения двоичного представления числа требуется 8 бит.

С этого момента вы начали немного дрейфовать. На самом деле для хранения числа не требуется 8 бит. В зависимости от числа для его хранения может потребоваться 16, 32, 64 или даже больше битов. Разделение ваших 16 бит на 2 неверно. Если бы не специфика реализации процессора, могли бы быть, например, двухбитные числа. В этом случае эти два бита могут хранить такие значения, как:

Чтобы сохранить 4, нам нужно 3 бита. И поэтому значение «не подходит», вызывая переполнение. То же самое относится и к 16-битному числу. Например, скажем, у нас есть беззнаковое "255" в десятичном виде, хранящееся в 16-битах, двоичное представление будет 0000000011111111 . Когда вы добавляете 1 к этому числу, оно становится 0000000100000000 (256 в десятичном формате). Поэтому, если бы у вас было только 8 бит, оно переполнилось бы и стало равным 0, потому что самый старший бит был бы отброшен.

Теперь максимальное беззнаковое число, которое вы можете использовать в 16-битной памяти, — 11111111111111111 , что равно 65535 в десятичном виде. Другими словами, для беззнаковых чисел установите все биты в 1, и это даст вам максимально возможное значение.

Однако для чисел со знаком старший бит представляет знак — 0 соответствует положительному значению, а 1 — отрицательному. Для отрицательных значений максимальное значение равно 1000000000000000 , что составляет -32678 по основанию 10. Правила двоичного представления со знаком хорошо описаны здесь.

Ответ на этот вопрос. как указано в ключе ответа б) 127. И я понятия не имею, как они пришли к этому результату.

EDIT. Еще одна очень похожая очередь. заданный на том же экзамене был

Максимально допустимое целое число на компьютере с n-битным текстовым процессором и одним словом на целое равно

а) 2 н - 1 - 1
б) 2 н - 1
в) 2 н - 1 + 1
г) 2 н + 1

Ответ. это а) 2 n - 1 - 1 (согласно официальному ключу ответа).

Положив n = 8 сверху que. мы получили ответ 127. Но опять же, я понятия не имею, как они тоже получили этот ответ.

$\begingroup$ Нет упоминания о подписанном или беззнаковом числе. Que. задается на экзамене, как указано выше. Никаких других подробностей не приводится. $\endgroup$

$\begingroup$ Вы можете представить до $256$ различных значений. Фактический набор значений (и, следовательно, его максимальный элемент) зависит от вашей кодировки. Вопрос, вероятно, предполагает, что целые числа подписываются и хранятся с использованием дополнения до двух. См. также эту страницу в Википедии. $\endgroup$

$\begingroup$ Это неразумный вопрос, ИМО. Ответ может быть b или d в зависимости от подписи, которую вопрос, по-видимому, не указал. $\endgroup$

$\begingroup$ Правильный ответ на оба вопроса заключается в том, что для ответа на вопрос недостаточно информации. $\endgroup$

4 ответа 4

Я считаю, что нижеследующее является разумным вердиктом, учитывая отсутствие контекста, как сказано в комментарии Стивена и комментарии Гарольда.

Существует $2^8$ (256) различных возможных значений для 8 бит. Если он не подписан, он может принимать значения от 0 до 255; при подписании он имеет от -128 до 127.

Числа без знака — это одна из интерпретаций последовательности битов. Это также самая простая и наиболее часто используемая интерпретация внутри ЦП, потому что адреса и коды операций - это просто биты. Адресация памяти / стека и арифметика являются основой микропроцессора, ну, обработки. Двигаясь вверх по пирамиде абстракции, можно увидеть еще одну частую интерпретацию битов как символов (ASCII, Unicode, EBCDIC).

Сказав вышеизложенное, позвольте мне встать на защиту выбора автора этого экзамена, даже несмотря на то, что я НЕ стал бы формулировать набор вопросов и ответов так, как они представлены в вопросе.

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

Однако, если учащийся выбирает "d) (255)10", может быть трудно обосновать, что учащийся знает, что происходит с целыми числами со знаком. Таким образом, если целью экзамена является проверка того, что учащиеся усвоили, вариант б) может быть уместным.

Таким образом, в контексте экзамена у учащегося будет больше шансов считаться более знающим, если будет выбран вариант b) вместо варианта d). Или больше шансов получить лучшую оценку.

Подробное объяснение дополнения до двух можно найти на этой странице Википедии.

Читайте также: