Страница: 1 |
|
Вопрос: Зачем в signed бит для знака?
|
Добавлено: 04.10.11 13:02
|
|
Автор вопроса: ---Fix--- | ICQ: 348680795
|
Почему в signed переменных используют бит для хранения знака? ведь без него диапазон данных по ширине тот же и знак определяться может не в качестве бита в памяти, а как тип данных(т.е, например, если тип данных signed то число отрицательное то, которое меньше половины диапазона)
Ответить
|
Номер ответа: 6 Автор ответа: ---Fix---
ICQ: 348680795
Вопросов: 12 Ответов: 33
|
Профиль | | #6
|
Добавлено: 05.10.11 12:58
|
Вот доказательство:
создай windowsForms проект добавь текст бокс и назови его t1
и вставь код
Public Class Form1
- Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- t1.Text = "-128 in Sbyte: "
-
- Dim b As SByte() = {Convert.ToSByte(-128)}
- Dim BA As New BitArray(System.BitConverter.GetBytes(b(0)))
- t1.Text &= String.Concat(Convert.ToInt32(BA(0)), Convert.ToInt32(BA(1)), _
- Convert.ToInt32(BA(2)), Convert.ToInt32(BA(3)), _
- Convert.ToInt32(BA(4)), Convert.ToInt32(BA(5)), _
- Convert.ToInt32(BA(6)), Convert.ToInt32(BA(7)))
- b(0) = Convert.ToSByte(127)
- BA = New BitArray(System.BitConverter.GetBytes(b(0)))
- t1.Text &= System.Environment.NewLine & "127 in Sbyte: "
- t1.Text &= String.Concat(Convert.ToInt32(BA(0)), Convert.ToInt32(BA(1)), _
- Convert.ToInt32(BA(2)), Convert.ToInt32(BA(3)), _
- Convert.ToInt32(BA(4)), Convert.ToInt32(BA(5)), _
- Convert.ToInt32(BA(6)), Convert.ToInt32(BA(7)))
- End Sub
- End Class
как видно из примера крайний правый бит отвечает за знак
неужели никто не знает ответ?
Ответить
|
Номер ответа: 8 Автор ответа: AgentFire
ICQ: 192496851
Вопросов: 75 Ответов: 3178
|
Профиль | | #8
|
Добавлено: 05.10.11 19:48
|
Winand пишет:
что-то я не понял вопроса. диапазоны чисел у знаковых и беззнаковых переменных разные, но (не знаю как грамотно сказать) ширина диапазона одинаковая.
2битное беззнаковое: 0, 1, 2, 3
знаковое: 0, 1, -1, -2
как вы собираетесь увеличить диапазон вдвое? больше 4х чисел не влезет
у двух бит есть следующие 4 комбинации.
00, 01, 10, 11.
беззнаковое воспринимает эти комбинации бит как 0, 1, 2, 3 соответственно.
а знаковое как 0, 1, -2, -1 (вроде как тоже соответственно)
Ответить
|
Номер ответа: 9 Автор ответа: Artyom
Разработчик
Вопросов: 130 Ответов: 6602
|
Профиль | | #9
|
Добавлено: 06.10.11 08:41
|
Почему в signed переменных используют бит для хранения знака? ведь без него диапазон данных по ширине тот же и знак определяться может не в качестве бита в памяти, а как тип данных(т.е, например, если тип данных signed то число отрицательное то, которое меньше половины диапазона)
Так и есть. Только число считает отрицательным, если оно больше половины диапазона.
AgentFire, это не форматирование другое, а дополнительный код
http://ru.wikipedia.org/wiki/%D0%94%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4_(%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%87%D0%B8%D1%81%D0%BB%D0%B0)
Если последний бит равен 0, то число является положительным и с ним можно работать. Если последний бит равен 1, то число является отрицательным, но, чтоб понять что там на самом деле лежит (модуль числа), нужно применить определенный набор знаний матанализа (а именно операцию NOT к каждому биту и прибавить 1 к результату).
Это определенным образом позволяет выполнять операцию вычитания с помощью тех же сумматоров, которыми выполняется операция сложения. Благодаря этому экономится половина полимеров при производстве процессоров.
Побочный эфект состоит в том, что отрицательных чисел больше чем положительных, и можно словить переполнение, просто поменяв знак у числа или получив его модуль.
PS Гарантирую это как специалист, прослушавший курс "Схемотехника" несколько лет назад.
Ответить
|
Страница: 1 |
Поиск по форуму