Как узнать как представлены целые отрицательные числа в .NET в двоичном виде?
Есть три возможных варианта (возьмем для примера знаковый байт):
-1: 11111111
-1: 10000000
и
-1: 10000001 (тогда появляется так называемый минус ноль: 10000000, но тогда не получается диапазон от -128 до 127)
Сам склоняюсь к первому варианту, хотя во многой теоритической литературе (оторванной от NET) написано что они должны быть представлены как третий вариант и везде красиво делаются операции сложения, вычитания на этом, но как я понимаю в NET все представлено в первом варианте и как тут тогда делать разные операции, если вся теоритическая литература тогда идет через з@д.
Видимо NET где-то "в уме" приводит числа к третьему виду перед манипуляциями? Или нет?
Здравствуйте, PaulMinelly, Вы писали:
PM>Есть три возможных варианта (возьмем для примера знаковый байт): PM>-1: 11111111 PM>-1: 10000000 PM>и PM>-1: 10000001 (тогда появляется так называемый минус ноль: 10000000, но тогда не получается диапазон от -128 до 127) PM>Сам склоняюсь к первому варианту, хотя во многой теоритической литературе (оторванной от NET) написано что они должны быть представлены как третий вариант и везде красиво делаются операции сложения, вычитания на этом, но как я понимаю в NET все представлено в первом варианте и как тут тогда делать разные операции, если вся теоритическая литература тогда идет через з@д.
Вы какую литературу читали? Не вижу ничего красивого во 2 и 3 вариантах, банальное сложение с 1 дает -2. Вобщем правильной дорогой у вас такая литература идет.
Здравствуйте, PaulMinelly, Вы писали:
PM>Как узнать как представлены целые отрицательные числа в .NET в двоичном виде?
PM>Есть три возможных варианта (возьмем для примера знаковый байт): PM>-1: 11111111 PM>-1: 10000000
Ага, только так:
11111111
00000001
PM>Видимо NET где-то "в уме" приводит числа к третьему виду перед манипуляциями? Или нет?
На уя? 11111111 + 00000001 = 0
Это родной формат процессоров x86 так что в NET как и везде не стали изобретать какой-то свой тормозной велосипед.
Здравствуйте, _d_m_, Вы писали:
___>Здравствуйте, PaulMinelly, Вы писали:
PM>>Как узнать как представлены целые отрицательные числа в .NET в двоичном виде?
PM>>Есть три возможных варианта (возьмем для примера знаковый байт): PM>>-1: 11111111 PM>>-1: 10000000
___>Ага, только так:
___>11111111 ___>00000001
[StructLayout(LayoutKind.Explicit, Size = 4)]
public struct IntValue
{
[FieldOffset(0)]
public byte B0;
[FieldOffset(1)]
public byte B1;
[FieldOffset(2)]
public byte B2;
[FieldOffset(3)]
public byte B3;
public int Value;
}
Здравствуйте, PaulMinelly, Вы писали:
PM>Как узнать как представлены целые отрицательные числа в .NET в двоичном виде?
зависит от того — под какую платформу у вас .Net Runtime машина — и от её реализации — в нормальных условиях — вас это не должно волновать. Можете написать свой Runtime и хранить как вам нравится. Всю логику лучше делать чере обёртки — там есть кажется BinaryWriter и BinaryReader, Formatter и тп.
Здравствуйте, PaulMinelly, Вы писали:
PM>Есть три возможных варианта (возьмем для примера знаковый байт): PM>-1: 11111111 PM>-1: 10000000 PM>и PM>-1: 10000001 (тогда появляется так называемый минус ноль: 10000000, но тогда не получается диапазон от -128 до 127) PM>Сам склоняюсь к первому варианту, хотя во многой теоритической литературе (оторванной от NET) написано что они должны быть представлены как третий вариант и везде красиво делаются операции сложения, вычитания на этом
Что это у тебя за литература такая странная? Дополнительный код — читать до просветления.
... <<RSDN@Home 1.2.0 alpha 4 rev. 1082 on Windows Vista 6.0.6001.65536>>
PM>>Есть три возможных варианта (возьмем для примера знаковый байт): PM>>-1: 11111111 PM>>-1: 10000000 PM>>и PM>>-1: 10000001 (тогда появляется так называемый минус ноль: 10000000, но тогда не получается диапазон от -128 до 127) PM>>Сам склоняюсь к первому варианту, хотя во многой теоритической литературе (оторванной от NET) написано что они должны быть представлены как третий вариант и везде красиво делаются операции сложения, вычитания на этом
AVK>Что это у тебя за литература такая странная? Дополнительный код — читать до просветления.
Спасибо! Пара вопросов: Дополнительным кодом представляют только отрицательные числа? И почему он дополнительный, что он дополняет?
Здравствуйте, PaulMinelly, Вы писали:
AVK>>Что это у тебя за литература такая странная? Дополнительный код — читать до просветления.
PM>Спасибо! Пара вопросов: Дополнительным кодом представляют только отрицательные числа? И почему он дополнительный, что он дополняет?
Здравствуйте, nikov, Вы писали:
N>Здравствуйте, PaulMinelly, Вы писали:
AVK>>>Что это у тебя за литература такая странная? Дополнительный код — читать до просветления.
PM>>Спасибо! Пара вопросов: Дополнительным кодом представляют только отрицательные числа? И почему он дополнительный, что он дополняет?
N>Так ты прочитал указанную статью или нет?
Прочитал. Отрицателные числа написано представлены дополнительным кодом. Не очень понятно что он дополняет, если он просто напросто самостоятельно представляет отрицательные числа безо всяких дополнений.
Здравствуйте, PaulMinelly, Вы писали:
PM>>>Спасибо! Пара вопросов: Дополнительным кодом представляют только отрицательные числа? И почему он дополнительный, что он дополняет?
N>>Так ты прочитал указанную статью или нет?
PM>Прочитал. Отрицателные числа написано представлены дополнительным кодом. Не очень понятно что он дополняет, если он просто напросто самостоятельно представляет отрицательные числа безо всяких дополнений.
Дополнительный код отрицательного числа получается инвертированием двоичного числа и прибавлением к нему единицы.
___>Дополнительный код отрицательного числа получается инвертированием двоичного числа и прибавлением к нему единицы.
___>или другими словами: дополняем единицей.
Дополнительным называется потому, что отрицательное число является дополнением равного по модулю положительного числа до машинного нуля. Таким образом сложение чисел в дополнительном коде не требует доплнительных телодвижений для учета знаков чисел.
PM>>Прочитал. Отрицателные числа написано представлены дополнительным кодом. Не очень понятно что он дополняет, если он просто напросто самостоятельно представляет отрицательные числа безо всяких дополнений.
"Дополнительный код" в старых советских учебниках по теории автоматов назывался "дополнением до двух".
В той же статье в Википедии по дополнительному коду так и написано: "Дополнительный код (англ. Two's complement)".
Вот и соответствующая статья: Two's_complement.
Почему именно "до двух"? По видимому из самого определения этого "дополнения до двух" (его формулы): "The two's complement of a binary number is defined as the value obtained by subtracting the number from a large power of two (specifically, from 2^N for an N-bit two's complement)."
Т.е. в двоичном представлении само число + его дополнение до двух = степень двойки (2^N).
А то, что этот код стал повсеместно использоваться в компьютерной арифметике для представления отрицательных чисел, было обусловлено удобством проектирования логических схем — все арифметика делалась на сумматорах.