Сучасна диджитал-освіта для дітей — безоплатне заняття в GoITeens ×
Mazda CX 30
×
👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
да я уже разобрался — как оказалось, все до безобразия просто, в ДК нет такого абстрактного понятия как отрицательный 0, да и понятия положительный 0, тоже нету, есть просто 0.:) Поэтому, в ДК 10000000 «отдали» (-128), а не (-0).

rassamaha, Спасибо.

2 level1:) красиво, но не верно
число −150, не влезает в байт. т.к. 1ый бит знаковый, итого максимум можно записать ± 127 в ПК!, но опять же, т.к. существует ДК, то можно записать и −128. пример был приведен выше.
Есть безнаковый байт и там от 0 до 255, тогда 150 можно записать, но не −150)

Перечитай вику, там все правильно написано.

Если без лишних букв, то переводится в ДК на примере числа (-11)

двоичный код +11 инверсия +1

-11 —> 0000 1011 —> 1111 0100 —> 1111 0101

Или словесное описание алгоритма:

1. записать прямой код модуля числа;
2. инвертировать его (заменить единицы нулями, нули — единицами);

3. прибавить к инверсному коду единицу.

При таких описаниях, вообще не вижу помех выйти за пределы и (-128)
Например, возьмем число (-150):
двоичный код +150 инверсия +1
-150 —> 10010110 —> 01101001 —> 01101010
ну все нормально, вложились в 1 байт, только вот после (-128) старший бит в ДК равен 0, а это неправильно, так как он знаковый, то он должен быть равен 0, только на основании этого я и сделал вывод, почему диапазон заканчивается на (-128) включительно.
Дальше начал сходить с ума, и решил проверить, что будет если, например, (151) суммировать с (-150) неправильно посчитанным выше, по идее должно получиться что то неправильное, смотрим:

10010111 (151) + 01101010 (типа −150) = 100000001 — получили 9 бит, а есть всего 8, откинем старший разряд, получим, 151−150=1.

Юзай Вику:
ДК

там вроде все нормально расписано.

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

Инвертируем все разряды числа, получая таким образом обратный код:
1010

Добавим к результату 1 и допишем знаковый единичный разряд
1011

Для обратного преобразования используется тот же алгоритм. А именно:
1011

Инвертируем все разряды числа, получая таким образом обратный код:
0100

Добавим к результату 1 и проверим, сложив с дополнительным кодом
 0101 + 1011 = 10000, пятый разряд выбрасывается.

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

мне интересно и о отрицательном ноле, только я вот с ДК еще не до конца разобрался:

Дополнительный код.

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

смотрим как получить обратный код:

Для отрицательного числа все цифры числа заменяются на противоположные (1 на 0, 0 на 1), а в знаковый разряд заносится единица.

со знаковыми разрядами — это прямой код, в прямом коде для записи числа 7 бит — (128) не влазит.: (

rassamaha, можете расписать сам алгоритм, как Вы переводите в ДК?

2 qwerty — это 128) ИМХО
2 level1 — значит число хранится в ДК. Архитектура х86 работает в ДК. В ПК действительно только ± 127.

Есть еще понятие отрицательный ноль в архитетуре компьютеро, но наверно тебе это не интересно:)

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

Прямой код.
Прямой код числа в двоичной системе счисления совпадает по изoбражению с записью самoгo числа в двоичной системе счисления. Значение знакoвого разряда для положительных чисел равно 0, для отрицательных чисел — (1). Знаковым разрядом обычно является крайний разряд в разрядной сетке.
Пример:

Если для записи кода выделен один байт, то для числа (+1) прямой код 0×000 0001, для числа (-1) прямой код 1×000 0001.

это вырезка из документации, исходя из нее крайний бит СТРОГО предназначен для записи знака числа, а 7 бит СТРОГО предназначены для записи самого числа, значит, получается, что мы должны впихнуть (128) в 7 бит, но как? в 7 бит — максимум лезет 127, то естьle мы можем работать с диапазоном от (-127) до (127)

1 000 0000 это что в 2-ичном формате?

to cencio

блин... где ты был раньше... я уже свой метод написал по переводу...:)

2 level1
Про Дополнительный Код- ДК слышал?
0 111 1111 — это 127
1 111 1111 — это −128, ибо все еденицы кроме первой инвертируются, и получается число 128,!!!, но т.к. это в знаковом разряде 1, то «-» итого −128.
Есть еще Обратный Код (OK) и вроде Инверсный Код (ИК)
OK используется в Маках, поэтому трудно установить Microsoft на Макинитошское железо, ибо Microsoft использует ДК.

Могу еще рассказать как сумматор работает — 133 серии:)

2 cencio: я подозревал, что как-то так и должно выглядеть, но проверить не было возможности.

З.Ы. Все гениальное просто =)

о, кстати, ребят, объясните, пожалуйста, почему в 1 байт влазит диапазон от −128 до 127?
1 байт = 8 бит, из 8 бит 1 бит идет как знаковый разряд, в остальные 7 бит записываем число, 127 (10) — это как раз 1111111 (2) — все норм, все влазит,

а как (-128) влазит не пойму: (

есть, работают в обе стороны, примерно так


            //Convert to binary from integer
            int useBase = 2;
            long data = 768;
            //returns in base 2
            string strBinary = Convert.ToString(data, useBase);
            //Convert to integer from binary
            int integer = Convert.ToInt32("1011", useBase);

Готовых родных классов не встречал, хотя наверняка есть.

возьмите такой вариант.

using System;

namespace ConsoleApplication1
{
class Program
{
static string DecToBase(int num_value, int base_value)
{
var max_bit = 32;
var dec_base = 10;
var hexchars = new[] { ’A’, ’B’, ’C’, ’D’, ’E’, ’F’ };
var result = string.Empty;
var result_array = new int[32];

for (/* nothing */; num_value > 0; num_value /= base_value)
{
int i = num_value % base_value;
result_array[—max_bit] = i;
}

for (int i = 0; i < result_array.Length; i++)
{
if (result_array[i] >= dec_base)
{
result += hexchars[(int)result_array[i] % dec_base].ToString();
}
else
{
result += result_array[i].ToString();
}
}

result = result.TrimStart(new char[] {’0′});
return result;
}

static void Main(string[] args)
{
int i = 256;
Console.WriteLine("{0} in binary is {1}", i, DecToBase(i, 2));
Console.ReadLine();
}
}
}

Підписатись на коментарі